Нет, изменение типа петли не имеет значения.
Единственное, что может сделать это быстрее, это иметь меньше вложенности циклов и циклически перебирать меньшие значения.
Единственная разница между циклом 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 - это синтаксически более симпатичный способ зацикливания.
Ну вот и окончательный ответ. Я использовал отличную идею Джимми (которая, к сожалению, не является завершенной) и функцию полной рекурсии для правильной работы.
На основе интерфейса:
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%, но я мало тестировал его, поэтому он может не охватывать некоторые особые случаи ... Но это хорошая основа для начала.
Обязательный ответ с использованием 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>
обязательный ответ с использованием 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));
}