C#:Как удалить информацию о пространстве имен из XML-элементов

StackOverflow https://stackoverflow.com/questions/413050

  •  03-07-2019
  •  | 
  •  

Вопрос

Как я могу удалить информацию о пространстве имен "xmlns: ..." из каждого XML-элемента в C #?

Это было полезно?

Решение

Несмотря на предостерегающий ответ Zombiesheep, мое решение состоит в том, чтобы очистить xml с помощью преобразования xslt, чтобы сделать это.

мыть.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>

Другие советы

Отсюда 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));
    }
}

У меня была похожая проблема (мне нужно было удалить атрибут пространства имен из определенного элемента, а затем вернуть XML как XmlDocument в BizTalk), но причудливое решение.

Прежде чем загружать строку XML в объект XmlDocument , я произвел замену текста, чтобы удалить некорректный атрибут пространства имен. Сначала это казалось неправильным, так как в итоге я получил XML, который не мог быть проанализирован «XML Visualizer». в Visual Studio. Это то, что изначально оттолкнуло меня от такого подхода.

Однако текст все еще может быть загружен в XmlDocument , и я могу вывести его в BizTalk нормально.

Также обратите внимание, что ранее я попал в один тупик при попытке использовать childNode.Attributes.RemoveAll () для удаления атрибута пространства имен - он просто вернулся снова!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top