我有一个XML文件,我想从中检索所有唯一路径。在以下示例中:
<?xml version="1.0" encoding="utf-8"?>
<views>
<invoice>
<newRa elem="0">
<createD>20150514</createD>
<modD>1234</modD>
<sample>text</sample>
</newRa>
<total>1.99</total>
</invoice>
</views>
我想检索:
views/invoice/newRa/createD
views/invoice/newRa/modD
views/invoice/newRa/sample
and so on......
我对xPath有一定的经验,但是我不确定如何从VB开始设置一个可以为我完成此任务的子程序。请注意,我正在使用.NET 2.0,因此不可能使用LINQ。
编辑1:
Dim xOne As New XmlDocument
xOne.Load("d/input/oneTest.xml")
For Each rNode As XmlNode In xOne.SelectSingleNode("/")
If rNode.HasChildNodes Then
subHasChild(rNode)
End If
Next
Private Sub subHasChild(ByVal cNode As XmlNode)
Dim sNode = cNode.Name
If cNode.HasChildNodes Then
sNode = sNode + "/" + cNode.FirstChild.Name
cNode = cNode.FirstChild
subHasChild(cNode)
End If
Dim sw As New StreamWriter("d:\input\paths.txt")
sw.WriteLine(sNode)
sw.Flush() : sw.Close() : sw.Dispose()
End Sub
最佳答案
试试这个:
Dim xd = <?xml version="1.0" encoding="utf-8"?>
<views>
<invoice>
<newRa elem="0">
<createD>20150514</createD>
<modD>1234</modD>
<sample>text</sample>
</newRa>
<total>1.99</total>
</invoice>
</views>
Dim getPaths As Func(Of XElement, IEnumerable(Of String)) = Nothing
getPaths = Function(xe) _
If(xe.Elements().Any(), _
xe.Elements() _
.SelectMany( _
Function(x) getPaths(x), _
Function(x, p) xe.Name.ToString() + "/" + p) _
.Distinct(), _
{ xe.Name.ToString() })
Dim paths = getPaths(xd.Root)
它给了我:
views/invoice/newRa/createD
views/invoice/newRa/modD
views/invoice/newRa/sample
views/invoice/total
它正确地摆脱了重复的路径。
关于xml - 以XML返回不同的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30338446/