【问题标题】:Adding XmlElement to a non-root node list using VB.NET使用 VB.NET 将 XmlElement 添加到非根节点列表
【发布时间】:2016-07-28 21:49:09
【问题描述】:

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

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

但我收到一条错误消息,提示我无法使用“/”字符。不知道如何解决?

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

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

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

希望这会有所帮助! 再次感谢!

【问题讨论】:

    标签: xml vb.net element xelement


    【解决方案1】:

    创建元素,然后使用 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 to 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>
    )
    

    【讨论】:

    • 感谢您的快速回复。不知道为什么这不起作用,似乎也弄乱了 xml 文件的格式?也许我可以澄清一下:我有这个: //Content/Catalog/Feature[7]/Option[1]/code=ABC //Content/Catalog/Feature[7]/Option[2]/code=DEF...等到 Option[68] 我想添加://Content/Catalog/Feature[7]/Option[1]/code=ZZZ 顺便说一句,“代码”是一个属性(如果重要的话)感谢您提供的任何帮助.
    • @kman 如果您更新问题以显示您想要实现的目标,这将有所帮助。在 XML 示例之前/之后显示您想要什么以及它是如何不工作的。
    • 我更新了我的消息。这是第二个图片链接:[链接]kwhdesign.ca/Temp/AfterCode.jpg
    • @kman 更新了我的答案 - 希望我越来越接近你想做的事情! :-)
    • 好的,我将使用 XDocument/Xelement 方法,是时候学习新技巧了!它工作得很好。感谢 Mark 和 dbasnett 提供的所有帮助。
    【解决方案2】:

    我更喜欢使用 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
    

    【讨论】:

    • 感谢 dbasnett。我想继续使用 XmlDocument 而不是使用 Xelement。我确实尝试使用 XElement 并且能够得到我想要的结果,但是发现了其他问题,例如如何读取单个节点的值或计算节点数,这肯定是因为我对 XElement 不太熟悉.. 我只是无法弄清楚如何完成这两个简单的功能。再次感谢,最终可能会回到 XElement。
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 2016-08-05
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多