使用 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
我正在尝试向 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