我目前在使用XML的VB.net中遇到了问题。我试图从所选节点中获取所有子节点并逐个返回它们。
代码返回节点,但是它们将它们全部转储到一个消息中。我也无法通过特定节点(文档)进行搜索。
的 XML
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Documents>
<DocType>
<Document ID="1">Document Name 1</Document>
<Fields>
<Field Type="Date">Field1</Field>
<Field Type="TxtBox">Field2</Field>
<Field Type="TxtBox">Field3</Field>
</Fields>
</DocType>
<DocType>
<Name ID="2">Document Name 2</Name>
<Fields>
<Field Type="Date">Field1</Field>
<Field Type="TxtBox">Field2</Field>
<Field Type="TxtBox">Field3</Field>
</Fields>
</DocType>
<DocType>
<Name ID="3">Document Name 3</Name>
<Fields>
<Field Type="Date">Field1</Field>
<Field Type="TxtBox">Field2</Field>
<Field Type="TxtBox">Field3</Field>
<Field Type="TxtBox">Field4</Field>
<Field Type="TxtBox">Field5</Field>
<Field Type="TxtBox">Field6</Field>
<Field Type="TxtBox">Field7</Field>
</Fields>
</DocType>
</Documents>
VB代码
Dim sd As New XmlDocument()
Dim sdXML As New FileStream("xmlFile.xml", FileMode.Open, FileAccess.Read)
Dim sdNode As XmlNodeList
Dim sdNum As Integer
Dim sdMSG As String
sd.Load(sdXML)
sdNode = sd.GetElementsByTagName("DocType")
For sdNum = 0 To sdNode.Count - 1
sdMSG = sdNode(sdNum).ChildNodes.Item(1).InnerText
''Show message box
MsgBox(sdMSG)
Next
回顾一下:我希望获得特定文档中每个字段的消息框
这是我第一次创建/使用XML数据,所以请原谅我丑陋的代码。
感谢您提供的所有帮助!
更新
我可以使用下面提供的SelectNodes函数Ann L选择特定的Document节点。我仍然遇到一个问题,消息框只显示该框中列出的所有字段的一个实例。
我选择的文件是&#39;文件名3&#39;。消息框在一个框中返回所有7个字段。如果可能,我想显示7个不同的消息框。
这是我正在使用的代码...
VB代码
Dim sd As New XmlDocument()
Dim sdXML As New FileStream("xmlFile.xml", FileMode.Open, FileAccess.Read)
Dim sdNode As XmlNodeList
Dim sdNum As Integer
Dim Field As Object
sd.Load(sdXML)
sdNode = sd.SelectNodes("descendant::DocType[Name='Document Name 3']")
For sdNum = 0 To sdNode.Count - 1
For Each Field In sdNode
MsgBox(sdNode(sdNum).ChildNodes.Item(1).InnerText)
Next
Next
答案 0 :(得分:0)
您的sdNode
会为您提供DocType
节点。它的子节点是Document
节点(或Name
节点;您的示例XML不一致)。
所以你需要深入到Fields
和Field
。
我暂时没有完成VB.NET,所以我的语法可能会关闭,但这大概就是你需要做的事情:
' DocType\Document\Fields\Field'
For sdNum = 0 To sdNode.Count - 1
fieldNode = sdNode(sdNum).GetElementsByTagName("Field")
for fldNum = 0 to fieldNode.Count - 1
sdMsg = fieldNode(fieldNum).InnerText
MsgBox(sdMsg)
Next
Next
我假设您要按DocType
或Document
节点处理节点;如果你只是想要所有的领域而不考虑他们的祖先是什么,你可以做到
fieldNode = sd.GetElementsByTagName("Field")
for fldNum = 0 to fieldNode.Count - 1
sdMsg = fieldNode(fldNum).InnerText
MsgBox(sdMsg)
Next
我不确定你的意思是&#34;其中name等于&#34;。你的意思是标签名称?或Name
元素的值?
如果要获取节点,使用复杂条件(例如,属于Field
且Document
= 2的所有id
个节点),您应该查看{{ 3}} function,并在SelectNodes。
其他答案(2015年4月27日新增):
您看到所有Field
个节点的原因&#39;压缩的内容是您要求InnerText
节点的Document
属性(您使用DocType
检索到的XPath
节点的第一个子节点。)& #34;的innerText&#34;检索当前节点的所有后代节点的内部文本,并一起搜索它。
要一次获得一个Field
个节点,您将不得不深入研究层次结构。
试试这个。它是从记忆中完成的,没有经过测试,但它大概是你所需要的:
sd.Load(sdXML)
sdNode = sd.SelectNodes("descendant::DocType[Name='Document Name 3']")
For sdNum = 0 To sdNode.Count - 1 ' This is the DocType node'
Dim Field as XmlNode
For Each Field In sdNode(sdNum).SelectNodes("descendent::Field")
MsgBox(Field.InnerText)
Next
Next