Как удалить все пространства имен из XML с C#?

Нет, изменение типа петли не имеет значения.

Единственное, что может сделать это быстрее, это иметь меньше вложенности циклов и циклически перебирать меньшие значения.

Единственная разница между циклом for и циклом while заключается в синтаксисе их определения. Там нет никакой разницы в производительности вообще.

int i = 0;
while (i < 20){
    // do stuff
    i++;
}

То же самое, что:

for (int i = 0; i < 20; i++){
    // do Stuff
}

(На самом деле цикл for немного лучше, потому что i будет вне области видимости после цикла, а i будет придерживаться примерно в случае цикла while.)

Цикл for - это синтаксически более симпатичный способ зацикливания.

100
задан Peter Stegnar 12 June 2009 в 15:03
поделиться

3 ответа

Ну вот и окончательный ответ. Я использовал отличную идею Джимми (которая, к сожалению, не является завершенной) и функцию полной рекурсии для правильной работы.

На основе интерфейса:

string RemoveAllNamespaces(string xmlDocument);

Я представляю здесь окончательное чистое и универсальное решение C # для удаления пространств имен XML:

//Implemented based on interface, not part of algorithm
public static string RemoveAllNamespaces(string xmlDocument)
{
    XElement xmlDocumentWithoutNs = RemoveAllNamespaces(XElement.Parse(xmlDocument));

    return xmlDocumentWithoutNs.ToString();
}

//Core recursion function
 private static XElement RemoveAllNamespaces(XElement xmlDocument)
    {
        if (!xmlDocument.HasElements)
        {
            XElement xElement = new XElement(xmlDocument.Name.LocalName);
            xElement.Value = xmlDocument.Value;

            foreach (XAttribute attribute in xmlDocument.Attributes())
                xElement.Add(attribute);

            return xElement;
        }
        return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el)));
    }

Это работает на 100%, но я мало тестировал его, поэтому он может не охватывать некоторые особые случаи ... Но это хорошая основа для начала.

100
ответ дан 24 November 2019 в 04:48
поделиться

Обязательный ответ с использованием XSLT:

<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>
9
ответ дан 24 November 2019 в 04:48
поделиться

обязательный ответ с использованием LINQ:

static XElement stripNS(XElement root) {
    return new XElement(
        root.Name.LocalName,
        root.HasElements ? 
            root.Elements().Select(el => stripNS(el)) :
            (object)root.Value
    );
}
static void Main() {
    var xml = XElement.Parse(@"<?xml version=""1.0"" encoding=""utf-16""?>
    <ArrayOfInserts xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
      <insert>
        <offer xmlns=""http://schema.peters.com/doc_353/1/Types"">0174587</offer>
        <type2 xmlns=""http://schema.peters.com/doc_353/1/Types"">014717</type2>
        <supplier xmlns=""http://schema.peters.com/doc_353/1/Types"">019172</supplier>
        <id_frame xmlns=""http://schema.peters.com/doc_353/1/Types"" />
        <type3 xmlns=""http://schema.peters.com/doc_353/1/Types"">
          <type2 />
          <main>false</main>
        </type3>
        <status xmlns=""http://schema.peters.com/doc_353/1/Types"">Some state</status>
      </insert>
    </ArrayOfInserts>");
    Console.WriteLine(stripNS(xml));
}
26
ответ дан 24 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: