2016-03-29 10 views
0

Ich habe eine XML-Datei und möchte einige Knoten davon in einer neuen XML-Datei extrahieren und speichern. Die XML-Datei lautet wie folgt:nur Elternknotenattribut ohne Kinder zugreifen

<?xml version="1.0" encoding="utf-8"?> 
<files version="2.1.8" Dir="D:Test\Exm_2" modified="2016-03-18 23:14:58Z" user="Test" language="en"> 
    <file name="1"> 
     <file name="4"> 
      <file name="9"> 
      </file> 
     </file> 
    </file> 
    <file name="2"> 
    </file> 
    <test name="3"> 
     <test name="5"> 
      <test name="7"> 
      </test> 
     </test> 
    </test> 
</files> 

Mein Ziel ist es, einige spezielle Knoten (hier Testknoten) dieser XML-Datei zu speichern. Die Idee ist, das damit verbundene root-Attribut zu speichern. Ich meine, wenn ich Knoten speichern test in einer neuen Datei mag ich das root-Attribut als die ursprüngliche XML-Datei haben will wie:

<?xml version="1.0" encoding="utf-8"?> 
<files version="2.1.8" Dir="D:Test\Exm_2" modified="2016-03-18 23:14:58Z" user="Test" language="en"> 
    <tests>  
     <test name="3"> 
      <test name="5"> 
       <test name="7"> 
       </test> 
      </test> 
     </test> 
    </tests> 
</files> 

Aber ich gegen sein Attribut zu speichern. Mein Code für die zweite XML-Datei zu speichern ist

public void Creat_Steps(string xmlfile, string FileName) 
{ 
    XElement doc = XElement.Load(xmlfile); 
    var item = doc.XPathSelectElement("//test"); 
    XElement newDoc = new XElement("files", new XElement("tests", item)); 
    XElement Docc = new XElement("files", item); 

    Docc.Save(FileName + ".xml"); 
} 

Aber dieser Code erstellen, die nur einen Wurzelknoten mit dem Namen files ohne Attribut. Ich muss das Attribut in der neuen XML-Datei verwenden und habe es dann nicht. Irgendwelche Ideen?

Vielen Dank im Voraus!

+0

Bitte beheben Sie Ihre Beispiel-XML - es ist derzeit ungültig, da Sie nicht genug Enddatei Elemente haben. Es ist nicht klar, ob das so ist, weil 'sollte' 'oder ob Name 9 in Name 4 sein sollte, aber es ist einfacher, Ihnen zu helfen, wenn die XML gültig ist beginnen mit. Wir sollten es nicht selbst reparieren müssen, um es zu testen. –

+0

Danke für Ihren Kommentar. Ich tat! –

Antwort

1

Der einfachste Ansatz wäre nur die untergeordneten Knoten des Root-Elements zu ersetzen, statt:

var root = XElement.Load(xmlFile); 
root.ReplaceNodes(new XElement("tests", root.Elements("test"))); 
root.Save(FileName + ".xml"); 

Beachten Sie, dass es für XPath keine Notwendigkeit, hier entweder :) Beachten Sie auch, dass ich mit Elements anstatt Descendants sonst wird jedes test Element ein neues unmittelbares Kind von tests, was nicht das ist, was Sie wollen.

Ich würde persönlich vorschlagen, XDocument zu verwenden, um Dokumente zu laden und zu speichern, da das deutlich Ihre Absicht, BTW angibt. An diesem Punkt würden Sie verwenden

var doc = XDocument.Load(xmlFile); 
doc.Root.ReplaceNodes(...); 
doc.Save(...); 
Verwandte Themen