2016-10-28 3 views
0

Ich versuche, eine kleine XML-Datei mit C# Linq XDocument zu schreiben.C# Linq XDoc - Element mit demselben Namen hinzufügen

Die endgültige XML-Datei sollte wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <Asset InternalID="SOMEID" LastSaveDate="2016-10-28" LastSaveTime="01:01:33:00" AssetType="New"> 
    <type_metadata> 
     <FIELD name="filename">SOMEID.MOV</FIELD> 
     <FIELD name="duration">00:00:00:10</FIELD> 
    </type_metadata> 
    </Asset> 
</Root> 

Hier ist mein Code:

XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", null)); 
doc.Add(new XElement("Root")); 
doc.Element("Root").Add(new XElement("Asset")); 
doc.Element("Root").Element("Asset").Add(new XAttribute("InternalID", a.InternalID)); 
doc.Element("Root").Element("Asset").Add(new XAttribute("LastSaveDate", a.lastSaveDate)); 
doc.Element("Root").Element("Asset").Add(new XAttribute("LastSaveTime", a.lastSaveTime)); 
doc.Element("Root").Element("Asset").Add(new XAttribute("AssetType", a.AssetType)); 
doc.Element("Root").Element("Asset").Add(new XElement("type_metadata")); 

doc.Element("Root").Element("Asset").Element("type_metadata").Add(new XElement("FIELD")); 
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Add(new XAttribute("name","filename")); 
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Value = a.filename; 

doc.Element("Root").Element("Asset").Element("type_metadata").Add(new XElement("FIELD")); 
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Add(new XAttribute("name", "duration")); 
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Value = a.duration; 

Alles funktioniert gut, bis ich versuche, in der zweiten "FIELD" Element zu setzen. Was ist der richtige Weg, dies zu tun? Ich habe etwas recherchiert, aber ich kann keine einfache Antwort finden, die direkt relevant ist für das, was ich erreichen möchte.

+0

Die letzten 3 Zeilen fügen ein zweites Element namens "FIELD" (mit verschiedenen Attributen) hinzu. Der Fehler ist Eine nicht behandelte Ausnahme vom Typ 'System.InvalidOperationException' in System.Xml.Linq.dll aufgetreten. Nachricht: Doppeltes Attribut –

Antwort

1

das, weil ist, wenn Sie versuchen, das zweite Element hinzufügen Sie verwenden:

doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD") 

Es wird das erste Element mit dem Namen zurückgeben, in diesem Fall ist das zuvor hinzugefügt "FIELD" -Element, das bereits "name" Attribut hat.

Ich würde vorschlagen, dass Sie das Element selbst erstellen, bevor Sie es an das Dokument anfügen. Auf diese Weise werden Sie nicht für das Element suchen müssen immer und immer wieder:

XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", null)); 

var root = new XElement("Root"); 

var asset = new XElement("Asset"); 
asset.Add(new XAttribute("InternalID", a.InternalID)); 
asset.Add(new XAttribute("LastSaveDate", a.lastSaveDate)); 
asset.Add(new XAttribute("LastSaveTime", a.lastSaveTime)); 
asset.Add(new XAttribute("AssetType", a.AssetType)); 

var type_metadata = new XElement("type_metadata"); 

var field = new XElement("FIELD"); 
field.Add(new XAttribute("name","filename")); 
field.Value = a.filename; 

type_metadata.Add(field); 

var field2 = new XElement("FIELD"); 
field2.Add(new XAttribute("name","duration")); 
field2.Value = a.duration; 

type_metadata.Add(field2); 

asset.Add(type_metadata); 

root.Add(asset); 

doc.Add(root); 

Sie können aber auch das gesamte Dokument in einer einzigen Anweisung erstellen:

XDocument doc = new XDocument(
    new XDeclaration("1.0", "UTF-8", null), 
    new XElement("Root", 
     new XElement("Asset", 
      new XAttribute("InternalID", a.InternalID), 
      new XAttribute("LastSaveDate", a.lastSaveDate), 
      new XAttribute("LastSaveTime", a.lastSaveTime), 
      new XAttribute("AssetType", a.AssetType), 
      new Element("type_metadata", 
       new XElement("FIELD", 
        new XAttribute("name", "filename"), 
        a.filename), 
       new XElement("FIELD", 
        new XAttribute("name", "duration"), 
        a.duration))))); 
+0

DANKE! Die einzelne Aussage funktionierte perfekt. Ich werde diese Methode von jetzt an verwenden. Das spart mir so viel Zeit, da ich viel mit XML arbeite. –

1

Es wäre einfacher, wenn Sie vor dem neuen FIELD Element vorbereiten auf das übergeordnete Element hinzugefügt wird:

var filename = new XElement("FIELD", 
        new XAttribute("name","filename"), 
        a.filename 
       ); 
var duration = new XElement("FIELD", 
        new XAttribute("name","duration"), 
        a.duration 
       ); 
doc.Element("Root").Element("Asset").Element("type_metadata").Add(field); 
doc.Element("Root").Element("Asset").Element("type_metadata").Add(duration); 
0

Dies kann in verschiedenen erreicht werden Wege. Ich bin deiner Vorgehensweise gefolgt. Da Sie mehrere FIELD-Elemente haben, ist eine geringfügige Änderung in Ihrem Code erforderlich. Der folgende Code funktioniert wie erwartet.

XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", null)); 
doc.Add(new XElement("Root")); 
doc.Element("Root").Add(new XElement("Asset")); 
doc.Element("Root").Element("Asset").Add(new XAttribute("InternalID", "intID")); 
doc.Element("Root").Element("Asset").Add(new XAttribute("LastSaveDate", "28.10.2016")); 
doc.Element("Root").Element("Asset").Add(new XAttribute("LastSaveTime", "1.48PM")); 
doc.Element("Root").Element("Asset").Add(new XAttribute("AssetType", "Laptop")); 
doc.Element("Root").Element("Asset").Add(new XElement("type_metadata")); 

doc.Element("Root").Element("Asset").Element("type_metadata").Add(new XElement("FIELD")); 
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Add(new XAttribute("name", "filename")); 
doc.Element("Root").Element("Asset").Element("type_metadata").Element("FIELD").Value = "a.txr"; 

doc.Element("Root").Element("Asset").Element("type_metadata").Add(new XElement("FIELD")); 
doc.Element("Root").Element("Asset").Element("type_metadata").Elements().Last().Add(new XAttribute("name", "duration")); 
doc.Element("Root").Element("Asset").Element("type_metadata").Elements().Last().Value = "00:12:98"; 
Verwandte Themen