2016-12-13 3 views
0

Ich verwende einen Legacy-Service, der Fetch CRM verwaltet: crmService.Fetch(fetchXml).Schnelle Ersatzknotennamen in XML

ich XML-String Ergebnis wie folgt aus:

<resultset> 
<result> 
<new_categoria name="Cliente" formattedvalue="1">1</new_categoria> 
<new_name>Admin</new_name> 
<new_tipodecampanaid>{F8F29978-4E0F-AE92-FB43-48B4DC406B1F}</new_tipodecampanaid> 
<statuscode name="Activo">0</statuscode> 
</result> 

<result> 
<new_categoria name="Client" formattedvalue="1">1</new_categoria> 
<new_name>Client</new_name> 
<new_tipodecampanaid>{758341BA-4661-D694-6743-8D2DC875793E}</new_tipodecampanaid> 
<statuscode name="Activo">0</statuscode> 
</result> 

<result> 

</resultset> 

Wir müssen (weil alias nicht für Fetch Methode unterstützen) ersetzen mehrere Knotennamen:

1 - Ersetzen Sie new_categoria Knotenname von org_category

2 - Ersetzen new_name Knotennamen org_name

3 - Ersetzen new_tipodecampanaid Knotennamen org_campaignid

Wir brauchen hohe peformance, vielleicht können die Ergebnisse sehr groß sein.

Mit XmlDocument:

var doc = new XmlDocument(); 
doc.LoadXml(fetchXMLResult); 

XmlNode root = doc.SelectSingleNode("resultset"); 
foreach (XmlNode childNode in root.ChildNodes) 
{ 

} 

XDocument Verwendung:

XDocument resultset = XDocument.Parse(fetchXMLResult); 
if (resultset.Root == null || !resultset.Root.Elements("result").Any()) 
{ 
    return; 
} 
resultset.Root.Elements("result") 

Irgendwelche Vorschläge?

Antwort

1

Für die Geschwindigkeit können Sie die Datei mit einem XmlReader durchlaufen und schreiben Sie jeden Knoten, den Sie lesen, in eine neue Datei mit einem XmlWriter.

Siehe this link für ein Beispiel.

1

Wenn Sie eine große XML-Datei haben, verwenden Sie immer XmlReader. Versuchen Sie diesen Code

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string INPUT_FILENAME = @"c:\temp\test1.xml"; 
     const string OUTPUT_FILENAME = @"c:\temp\test2.xml"; 
     static void Main(string[] args) 
     { 
      XmlReader reader = XmlReader.Create(INPUT_FILENAME); 
      XmlWriter writer = XmlWriter.Create(OUTPUT_FILENAME); 

      writer.WriteStartElement("resultset"); 
      while (!reader.EOF) 
      { 
       if (reader.Name != "result") 
       { 
        reader.ReadToFollowing("result"); 
       } 
       if (!reader.EOF) 
       { 
        XElement result = (XElement)XElement.ReadFrom(reader); 
        result.Element("new_categoria").Name = "org_category"; 
        result.Element("new_name").Name = "org_name"; 
        result.Element("new_tipodecampanaid").Name = "org_campaignid"; 

        writer.WriteRaw(result.ToString()); 
       } 
      } 
      writer.WriteEndElement(); 
      writer.Flush(); 
      writer.Close(); 

     } 
    } 
} 
+0

Verwenden Sie Folgendes: string xml = ""; StringReader sReader = new StringReader (xml); XmlReader reader = XmlReader.Create (sReader); – jdweng

+0

Vielleicht Kommentarcode in Antwort enthalten. Anzeigen http://stackoverflow.com/questions/4518544/xmlreader-from-a-string-content * Remember: XmlReader und StringReader implementieren IDisposable. * – Kiquenet