我有一個XML看起來像這樣的節點:XPath來選擇匹配
<?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
可以被命名爲CodeOut
或CodeIn
,但只有一個SE - 上
TimePeriod
的日期必須符合
是repeates在XML中的唯一節點是Series
節點。換句話說,每個Series
只有一個Period
,但是有很多不同Series
。
例如,獲得其中有他Codeout
或CodeIn
值全部Period
節點是C41073
或B85028
以及日期爲2013-07-18
。
我想,以匹配多個名稱,使用類似:
//*[@v="C41073"] | //*[@v="B85028"] | ...
,但我認爲這將是更好的,如果只匹配正確的節點,以防某個節點具有相同的值,ISN是嗎?
我正在尋找使用類似「contains」的東西,但它以不同的方式工作。
我使用.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")
而且在XPath序列中的每個元素節點名稱前添加ns:
。 (它看到這個以獲取更多信息:Is it possible to specify the namespace prefix just once in a xpath expression?)
TimePeriod元素上'v'屬性的值看起來不是標準的xml數據類型值。我認爲這是兩個用斜線分隔的日期/時間值(開始時間和結束時間)? –
是的。我所做的是使用'/'分割。我不知道它是否可能與xPath,即時通訊正在尋找它。 – SysDragon
您是否需要使用XPath?爲什麼不使用Linq到XML? –