次のような 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 つだけです。CodeOutCodeIn - の日付
TimePeriodは一致する必要があります
xml で繰り返される唯一のノードはSeriesノードです。Periodつまり、ごとに1 つしかありませんSeriesが、さまざまな がたくさんありますSeries。
たとえば、 or の値が or であり、日付が であるすべてのノードを取得しPeriodます。CodeoutCodeInC41073B850282013-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? )