webentwicklung-frage-antwort-db.com.de

Elemente zu einer XML-Datei in C # hinzufügen

Ich habe eine XML-Datei, die folgendermaßen formatiert ist:

<Snippets>
  <Snippet name="abc">
    <SnippetCode>
      testcode1
    </SnippetCode>
  </Snippet>

  <Snippet name="xyz">
    <SnippetCode>      
     testcode2
    </SnippetCode>
  </Snippet>

  ...

</Snippets>

Ich kann die Elemente erfolgreich mit XDocument laden, aber ich habe Probleme beim Hinzufügen neuer Elemente (es gibt viele Funktionen und die meisten, die ich ausprobiert habe, haben für mich nicht gut funktioniert). Wie würde das gemacht werden? Das neue Element würde das Snippet-Name-Tag und das Snippet-Code-Tag enthalten. Mein früherer Ansatz bestand darin, die Datei zu öffnen und das Element manuell mit einer Zeichenfolge zu erstellen, die zwar funktioniert, aber eine sehr schlechte Idee ist.

Was ich versucht habe:

XDocument doc = XDocument.Load(spath);
XElement root = new XElement("Snippet");
root.Add(new XElement("name", "name goes here"));
root.Add(new XElement("SnippetCode", "SnippetCode"));
doc.Element("Snippets").Add(root);
doc.Save(spath);

Und das Ergebnis ist folgendes:

<Snippet>
    <name>name goes here</name>
    <SnippetCode>
    code goes here
    </SnippetCode>
</Snippet>

Es funktioniert gut, außer dass das Namensschild falsch generiert wird. Es sollte sein 

<Snippet name="abc"> 

aber ich kann das nicht richtig generieren.

31
rayanisran

Sie sind nah dran, aber Sie möchten, dass name XAttribute und nicht XElement ist:

 XDocument doc = XDocument.Load(spath); 
 XElement root = new XElement("Snippet"); 
 root.Add(new XAttribute("name", "name goes here")); 
 root.Add(new XElement("SnippetCode", "SnippetCode")); 
 doc.Element("Snippets").Add(root); 
 doc.Save(spath); 
57
Jim Wooley

Sie müssen eine neue XAttribute anstelle von XElement erstellen. Versuchen Sie etwas so:

public static void Test()
{
    var xdoc = XDocument.Parse(@"
        <Snippets>

          <Snippet name='abc'>
            <SnippetCode>
              testcode1
            </SnippetCode>
          </Snippet>

          <Snippet name='xyz'>
            <SnippetCode>      
             testcode2
            </SnippetCode>
          </Snippet>

        </Snippets>");

    xdoc.Root.Add(
        new XElement("Snippet",
            new XAttribute("name", "name goes here"),
            new XElement("SnippetCode", "SnippetCode"))
    );
    xdoc.Save(@"C:\TEMP\FOO.XML");
}

Dies erzeugt die Ausgabe:

<?xml version="1.0" encoding="utf-8"?>
<Snippets>
  <Snippet name="abc">
    <SnippetCode>
      testcode1
    </SnippetCode>
  </Snippet>
  <Snippet name="xyz">
    <SnippetCode>      
     testcode2
    </SnippetCode>
  </Snippet>
  <Snippet name="name goes here">
    <SnippetCode>SnippetCode</SnippetCode>
  </Snippet>
</Snippets>
6
JohnD

Wenn Sie ein Attribut und kein Element hinzufügen möchten, müssen Sie Folgendes sagen:

XElement root = new XElement("Snippet");
root.Add(new XAttribute("name", "name goes here"));
root.Add(new XElement("SnippetCode", "SnippetCode"));

Der obige Code erzeugt das folgende XML-Element:

<Snippet name="name goes here">
  <SnippetCode>SnippetCode</SnippetCode>
</Snippet> 
5
svick

Sie können geneigt sein, Klassen zu erstellen, die der Struktur entsprechen, und einer Sammlung eine Instanz hinzufügen, dann die Sammlung serialisieren und deserialisieren, um das Dokument zu laden und zu speichern.

4
Kell

Ich habe XDocument.Root . Add verwendet, um Elemente hinzuzufügen. Root gibt XElement zurück, das über eine Add-Funktion für zusätzliche XElements verfügt 

2
Rob Haupt

Dies ist eine Erweiterung der obigen Antworten. Wenn in Ihrem XML-Namespace ein definierter Namespace (xmlns) definiert ist, wird beim Hinzufügen von untergeordneten Elementen ein ärgerlicher Nebeneffekt auftreten - xmlns = "" wird Ihrem neuen untergeordneten Element hinzugefügt.

Was Sie tun möchten (vorausgesetzt, das Element, das Sie hinzufügen, gehört zu demselben Namespace wie sein übergeordnetes Element) besteht darin, den Namespace vom übergeordneten Element parentElement.GetDefaultNamespace() zu übernehmen. 

var child = new XElement(parentElement.GetDefaultNamespace()+"Snippet", new XAttribute("Attr1", "42"), new XAttribute("Attr2", "22"));
child.Add(new XAttribute("Attr3", "777"));
parentElement.Add(child);

für übergeordnete Elemente mit mehreren Namespaces können Sie auswählen, welchen Sie verwenden möchten, indem Sie von parentElement.GetDefaultNamespace()+"Snippet" zu parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet".__ wechseln

var child = new XElement(parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet", new XAttribute("Attr1", "42"), new XAttribute("Attr2", "22"));
1
<Snippet name="abc"> 

name ist ein Attribut, kein Element. Deshalb versagt es. Verwenden Sie SetAttribute für das <Snippet>-Element. 

root.SetAttribute("name", "name goes here");

ist der Code, den Sie benötigen. 

0
Yatrix