Как я могу удалить информацию о пространстве имен «xmlns: ...» из каждого элемента XML в C#?
Нет, я получаю XML в строковом формате и должен преобразовать его в HTML (все еще в строковом формате).





Несмотря на предостерегающий ответ Zombiesheep, мое решение - промыть xml с помощью преобразования xslt для этого.
Wash.xsl:
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" indent = "no" encoding = "UTF-8"/>
<xsl:template match = "/|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match = "*">
<xsl:element name = "{local-name()}">
<xsl:apply-templates select = "@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match = "@*">
<xsl:attribute name = "{local-name()}">
<xsl:value-of select = "."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Большое вам спасибо за это. Это именно то, что я искал: теперь я сначала преобразовываю XML с помощью этого XSL, а затем применяю свой XSL к выходным данным. Ты спас мне день!
@Dimitre - как невероятно оскорбительно. Если вы хотите внести что-то ценное в таблицу, возможно, вы могли бы поддержать утверждение, что это будет разрушительным, а не атаковать очевидный (т.е. этот вопрос существует) факт, что пространства имен могут быть проблемой. "Ура" тебе, идиоту.
Отличный пост аннаката:] Спасибо!
У меня была аналогичная проблема (мне нужно было удалить атрибут пространства имен из определенного элемента, а затем вернуть XML как XmlDocument в BizTalk), но странное решение.
Перед загрузкой XML-строки в объект XmlDocument я произвел замену текста, чтобы удалить неправильный атрибут пространства имен. Сначала это казалось неправильным, так как я закончил с XML, который не мог быть проанализирован «XML Visualizer» в Visual Studio. Это то, что изначально оттолкнуло меня от такого подхода.
Однако текст все еще можно было загрузить в XmlDocument, и я мог нормально вывести его в BizTalk.
Также обратите внимание, что раньше я попал в тупик, пытаясь использовать childNode.Attributes.RemoveAll() для удаления атрибута пространства имен - он просто вернулся!
Отсюда http://simoncropp.com/working-around-xml-namespaces
var xDocument = XDocument.Parse(
@"<root>
<f:table xmlns:f = ""http://www.w3schools.com/furniture"">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>");
xDocument.StripNamespace();
var tables = xDocument.Descendants("table");
public static class XmlExtensions
{
public static void StripNamespace(this XDocument document)
{
if (document.Root == null)
{
return;
}
foreach (var element in document.Root.DescendantsAndSelf())
{
element.Name = element.Name.LocalName;
element.ReplaceAttributes(GetAttributes(element));
}
}
static IEnumerable GetAttributes(XElement xElement)
{
return xElement.Attributes()
.Where(x => !x.IsNamespaceDeclaration)
.Select(x => new XAttribute(x.Name.LocalName, x.Value));
}
}
Хотите взять файл, заменить текст и заново сохранить?