使用 VB.NET 将 XmlElement 添加到非根节点列表

Adding XmlElement to a non-root node list using VB.NET

我正在尝试向 XML 文件中的现有元素列表添加新元素。我正在使用此代码启动元素:

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

但是我收到一条错误消息,说我不能使用“/”字符。不确定如何解决这个问题?

更新: 我添加了两张图片,第一张是 XML 文件的视图以及数据所在的位置。 File:OriginalXML 蓝色项目中突出显示的是我想要添加的内容(不必位于列表顶部,附加数据可能更好)。 DisplayName、MultiMedia 和 CustomData 作为简单的 CDATA 文本。 第二个文件是当我 运行 你的代码时发生的事情。 (AfterCode.jpg)。请注意,突出显示的 "Option" 似乎在错误的位置并且格式丢失了。 如果你想查看原始 XML 文件,这里是: http://www.kwhdesign.ca/Temp/paf.xml

![原创XML]http://www.kwhdesign.ca/Temp/OriginalXML.jpg

(我不能post超过2个链接,所以我会在另一条评论中尝试第二张图片)

希望对您有所帮助! 再次感谢!

创建元素,然后使用 AppendChild:

将其添加到您想要的位置
Dim newElem As XmlElement = doc.CreateElement("Option")
doc.SelectSingleNode("/Content/Catalog/Feature[7]").AppendChild(newElem)

更新

目前还不完全清楚你想做什么,但如果你想在最后一个现有的 <Option> 元素之后插入一个新的 <Option> 元素,那么这样的事情将是一个开始,虽然我认为这表明这将是多么乏味(尽管完全有可能有一种更简单的方法来生成新选项)!

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)

与@dbasnett 一样,我更喜欢 XDocument/XElement 和 LINQ 而不是 XML。添加一个新的 <Option> 就像这样(注意这里的索引是基于 0 的,这与 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>
)

我更喜欢使用 xelement 来操作 XML。这是一个使用 xelement 的例子。它有几个调试语句,所以你可以看到它在每一步发生了什么。希望对你有帮助。

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