2016-07-28 8 views
0

Ich versuche, einer vorhandenen Liste von Elementen in einer XML-Datei ein neues Element hinzuzufügen. Ich verwende diesen Code, um das Element zu initiieren:XmlElement mit VB.NET zu einer Nicht-Root-Knotenliste hinzufügen

Dim newElem As XmlElement = doc.CreateElement("/Content/Catalog/Feature[7]/Option") 

Aber ich erhalte eine Fehlermeldung sagen, dass ich nicht das Zeichen „/“ verwenden kann. Nicht sicher, wie man das löst?

UPDATE: Ich füge zwei Bilder, die erste ist eine Ansicht der XML-Datei und wo die Daten befindet. Datei: OriginalXML Die blau markierten Elemente sind was ich hinzufügen möchte (muss nicht an der Spitze der Liste sein, das Anhängen der Daten ist wahrscheinlich besser). Der DisplayName, MultiMedia und CustomData als einfacher CDATA-Text. Die zweite Datei ist, was passiert, wenn ich Ihren Code ausführen. (AfterCode.jpg). Beachten Sie, dass die hervorgehobene "Option" an der falschen Stelle zu sein scheint und die Formatierung verloren geht. Wenn Sie an der ursprünglichen XML-Datei aussehen wollen, hier ist sie: http://www.kwhdesign.ca/Temp/paf.xml

[OriginalXML] http://www.kwhdesign.ca/Temp/OriginalXML.jpg

(Ich kann nicht mehr als 2 Links veröffentlichen, so dass ich das zweite Bild versuchen! in einem anderen Kommentar)

Hoffe das hilft! danke nochmal!

Antwort

0

Erstellen Sie das Element, dann fügen Sie, wo Sie es mit AppendChild wollen:

Dim newElem As XmlElement = doc.CreateElement("Option") 
doc.SelectSingleNode("/Content/Catalog/Feature[7]").AppendChild(newElem) 

UPDATE

Es ist noch nicht ganz klar, was Sie tun wollen, sind, aber wenn Sie möchten, um ein neues <Option> Element nach dem letzten existierenden <Option> einzufügen, wäre so etwas wie ein Anfang, obwohl ich denke, es zeigt, wie mühsam das sein wird (obwohl es durchaus möglich ist, gibt es einen einfacheren Weg zu g die neue Option erstellen)!

Dim newOption = doc.CreateElement("Option") 
newOption.SetAttribute("code", "ZZZ") 
Dim displayName = doc.CreateElement("DisplayName") 
displayName.SetAttribute("lang", "en-US") 
displayName.AppendChild(doc.CreateCDataSection("This is a test")) 
newOption.AppendChild(displayName) 
Dim feature = doc.SelectSingleNode("/Content/Catalog/Feature[7]") 
Dim lastOption = feature.SelectSingleNode("Option[last()]") 
feature.InsertAfter(newOption, lastOption) 

Wie @dbasnett, würde ich XDocument/XElement und LINQ to XML bevorzugen. ein neues <Option> würde das Hinzufügen dann so etwas sein (beachten Sie, dass Indizes 0 hier basieren, anders als in XPath):

Dim doc = XDocument.Load("paf.xml") 
doc.<Content>.<Catalog>.<Feature>(6).<Option>.Last().AddAfterSelf(
    <Option code="ZZZ"> 
    <DisplayName lang="en-US"><![CDATA[This is a test]]></DisplayName> 
    <Multimedia type="MediumImage"><![CDATA[Multimedia\Pictures\Medium\SherwinWilliams.jpg]]></Multimedia> 
    <Multimedia type="LargeImage"><![CDATA[Multimedia\Pictures\Large\SherwinWilliams.jpg]]></Multimedia> 
    <CustomData><![CDATA[<xml> 
    <RECKEY code="010201650004001V" /> 
    <VARProp VarID="1237" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="3518" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="3580" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="2149" PropID="VariableType" Expr="104" /> 
</xml>]]></CustomData> 
    </Option> 
) 
+0

Danke für die schnelle Antwort. Nicht sicher, warum das nicht funktioniert, scheint auch das Format der XML-Datei durcheinander zu bringen? Vielleicht kann ich klären: Ich habe dies: // Inhalt/Katalog/Feature [7]/Option [1]/code = ABC // Inhalt/Katalog/Feature [7]/Option [2]/code = DEF ... etc zu Option [68] Ich möchte hinzufügen: // Inhalt/Katalog/Feature [7]/Option [1]/code = ZZZ Übrigens "Code" ist ein Attribut (wenn das Angelegenheiten) Danke für jede Hilfe, die Sie anbieten können. – kman

+0

@kman Es würde helfen, wenn Sie die Frage aktualisieren, um zu zeigen, was Sie erreichen möchten.Zeige vorher/nachher XML-Beispiele von dem, was du willst und wie es funktioniert. – Mark

+0

Ich habe meine Nachricht aktualisiert. Hier ist der zweite Bildlink: [link] http://www.kwhdesign.ca/Temp/AfterCode.jpg – kman

0

ich viel lieber XElement mit XML-Manipulation. Hier ist ein Beispiel mit xelement. Es hat mehrere Debug-Anweisungen, so dass Sie sehen können, was bei jedem Schritt passiert. Ich hoffe es hilft.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Dim xe As XElement 
    'to load from a file 
    ' xe = XElement.Load("Your Path Here") 

    'for testing you can do this 
    xe = <content> 
      <Catalog> 
       <feature></feature> 
       <feature></feature> 
       <feature></feature> 
       <feature></feature> 
      </Catalog> 
     </content> 

    'to add an element to the base 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    xe.AddFirst(New XElement("foo")) 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    'to add an element to sub element 
    Dim optProto As XElement = <option></option> 
    Dim addthis As New XElement(optProto) 'note New 
    xe.<Catalog>...<feature>.ElementAt(3).Add(addthis) 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    addthis.Value = "added" 'note 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

End Sub 
+0

Danke dbasnett. Ich möchte lieber bei XmlDocument bleiben, anstatt Xelement zu verwenden. Ich habe versucht, XElement zu verwenden und war in der Lage, die gewünschten Ergebnisse zu erhalten, fand aber andere Probleme, wie den Wert eines einzelnen Knotens zu lesen oder eine Anzahl von Knoten zu zählen, es ist sicherlich, weil ich mit XElement nicht so vertraut bin konnte einfach nicht herausfinden, wie man diese zwei einfachen Funktionen macht. Nochmals vielen Dank, vielleicht endet die Rückkehr zu XElement. – kman

Verwandte Themen