VB - 逐行读取ChildNode,其中Name等于

时间:2015-04-17 15:59:32

标签: xml vb.net node.js

我目前在使用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

1 个答案:

答案 0 :(得分:0)

您的sdNode会为您提供DocType节点。它的子节点是Document节点(或Name节点;您的示例XML不一致)。

所以你需要深入到FieldsField

我暂时没有完成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

我假设您要按DocTypeDocument节点处理节点;如果你只是想要所有的领域而不考虑他们的祖先是什么,你可以做到

fieldNode = sd.GetElementsByTagName("Field")
for fldNum = 0 to fieldNode.Count - 1
   sdMsg = fieldNode(fldNum).InnerText
   MsgBox(sdMsg)
Next

我不确定你的意思是&#34;其中name等于&#34;。你的意思是标签名称?或Name元素的值?

如果要获取节点,使用复杂条件(例如,属于FieldDocument = 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