Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 对于SelectNodes不工作的每个_Xml_Vb.net - Fatal编程技术网

Xml 对于SelectNodes不工作的每个

Xml 对于SelectNodes不工作的每个,xml,vb.net,Xml,Vb.net,我有以下XML文件: 2018-06-21T00:30:31 50 5163 4. 1. 2. 欧元 2018-06-20T00:00:31 34 3143 4. 1. 2. 欧元 我想检查每个“事务”并保存节点的值。按照我的方式,它进入第二个“事务”,但当我做单节点时,它总是向我显示第一个的值。 我有以下代码: Dim oXML作为新的XmlDocument Dim ArquivoXML为String=TextBox1.Text oXML.Load(ArquivoXML) Dim经理作为新

我有以下XML文件:


2018-06-21T00:30:31
50
5163
4.
1.
2.
欧元
2018-06-20T00:00:31
34
3143
4.
1.
2.
欧元
我想检查每个“事务”并保存节点的值。按照我的方式,它进入第二个“事务”,但当我做单节点时,它总是向我显示第一个的值。 我有以下代码:

Dim oXML作为新的XmlDocument
Dim ArquivoXML为String=TextBox1.Text
oXML.Load(ArquivoXML)
Dim经理作为新的XmlNamespaceManager(oXML.NameTable)
mgr.AddNamespace(“df”,oXML.DocumentElement.NamespaceURI)
对于oXML中作为XmlNode的每个事务,选择Nodes(//df:Transaction),mgr)
invoice.Operator=Transaction.SelectSingleNode(//df:Transaction),mgr.ChildNodes(1).InnerText
invoice.PaymentMethod=Transaction.SelectSingleNode(//df:Methods),mgr.ChildNodes(0.InnerText)
invoice.Currency=Transaction.SelectSingleNode(“//df:Methods”,mgr).ChildNodes(1).InnerText
下一个
SelectSingleNode返回与XPath查询匹配的第一个节点,如果找不到匹配的节点,则返回null。因此,您要做的是始终查看第一个节点(在节点集合中)

基本上是这样的:

For Each NODE In NodeCollection
    something = NodeCollection(1) 'instead of 1,2,3...n
Next
你应该做的是:

Transaction.ChildNodes(1).InnerText 'transaction=NODE=NodeCollection(x)
当出现问题时,您应该中断代码并检查它

我从未使用过XML,但我会这样做(希望它能工作)

编辑:我将以下内容作为输出:

50
2
EUR
34
2
EUR

这些是预期值吗?

使用
/…
可以选择具有给定名称的所有节点。因此,在每次迭代中,表达式将再次求值,结果保持不变。要使用迭代,必须使用到当前节点的相对路径:

For Each Transaction As XmlNode In     oXML.SelectNodes("/df:Transactions/df:Transaction", mgr)
   invoice.Operator      = Transaction.SelectSingleNode("df:Operator", mgr).ChildNodes(0).InnerText
   invoice.PaymentMethod = Transaction.SelectSingleNode("df:Payments/df:Methods/df:Method", mgr).ChildNodes(0).InnerText
   invoice.Currency      = Transaction.SelectSingleNode("df:Payments/df:Methods/df:Currency", mgr).ChildNodes(0).InnerText
Next

这样做是可行的,但只适用于简单节点(如示例中所示)。如何在最复杂的节点(付款/方法/方法)中实现?我没有使用XML,但它类似于html,让我看看。记住“/”表示所有,“/”=唯一的孩子,.//和./”圆点表示来自这个“家长”。我更新了我的答案,而且那一行看起来不正确。有多种方法可以做到这一点,使用循环、使用孩子或使用路径选择,选择一种。您可以测试并查看哪一个最快,或者选择代码最短的一个,这取决于您。然后将您的问题标记为已回答。
50
2
EUR
34
2
EUR
For Each Transaction As XmlNode In     oXML.SelectNodes("/df:Transactions/df:Transaction", mgr)
   invoice.Operator      = Transaction.SelectSingleNode("df:Operator", mgr).ChildNodes(0).InnerText
   invoice.PaymentMethod = Transaction.SelectSingleNode("df:Payments/df:Methods/df:Method", mgr).ChildNodes(0).InnerText
   invoice.Currency      = Transaction.SelectSingleNode("df:Payments/df:Methods/df:Currency", mgr).ChildNodes(0).InnerText
Next