次のような XML があります。
<?xml version="1.0"?>
<RootName>
<RandomNode v="someValue"/>
<Series>
<Idendity v="C16"/>
<CodeOut v="C41073"/>
<Period>
<TimePeriod v="2013-07-18T22:00Z/2013-07-19T22:00Z"/>
<Resolution v="PT60M"/>
<Interval>
<Pos v="1"/>
<Qty v="14.1"/>
</Interval>
<Interval>
<Pos v="2"/>
<Qty v="20.7"/>
</Interval>
Period
そして、これらの条件に一致するすべてのノードを返す xPath が必要です。
- ノード
CodeOut
/CodeIn
には、配列にある値のいずれかの値があります - このノードにはまたは
CodeOut
という名前を付けることができますが、これらのうちの 1 つだけです。CodeOut
CodeIn
- の日付
TimePeriod
は一致する必要があります
xml で繰り返される唯一のノードはSeries
ノードです。Period
つまり、ごとに1 つしかありませんSeries
が、さまざまな がたくさんありますSeries
。
たとえば、 or の値が or であり、日付が であるすべてのノードを取得しPeriod
ます。Codeout
CodeIn
C41073
B85028
2013-07-18
次のようなものを使用して、複数の名前を一致させようとしました。
//*[@v="C41073"] | //*[@v="B85028"] | ...
しかし、他のノードが同じ値を持つ場合に備えて、正しいノードにのみ一致する方が良いと思いますね。
「含む」のようなものを使用して検索していましたが、別の方法で機能します。
それが重要な場合は、.Net を使用してい.SelectNodes()
ます。関数でこの xPath を使用します。
編集:
何か奇妙なことが起こっています。構文が正しくない可能性があります。このテストを見てください:
これ:doc.SelectNodes("/*")(0).Name
戻ってきましたRootName
これ:doc.SelectNodes("/*/*").Count
戻ってきました912
これ:doc.SelectNodes("/*/*")(11).Name
戻ってきましたSeries
しかし、これdoc.SelectNodes("/RootName").Count
は戻ってきています0
これdoc.SelectNodes("/*/Series").Count
は戻ってきて0
います そしてこれdoc.SelectNodes("/*/RootName").Count
は戻ってきています0
回答で提案されている他のすべての xPath シーケンスが機能しないようにします。
編集:
わかりました、それは名前空間でした、私はこれをしました:
Dim xmlnsManager As Xml.XmlNamespaceManager = New System.Xml.XmlNamespaceManager(doc.NameTable)
xmlnsManager.AddNamespace("ns", "http://example")
ns:
そして、xPath シーケンス内のすべての要素ノード名の前に追加します。(詳細については、これを参照してください: Is it possible to specify the namespace prefix just once in a xpath expression? )