我有一个如下所示的 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>
我需要一个 xPath 来返回Period
与这些条件匹配的所有节点:
- 节点
CodeOut
/CodeIn
具有我在数组中的任何值的值 - 此节点
CodeOut
可以命名为CodeOut
orCodeIn
,但只能命名为其中之一 - 日期
TimePeriod
必须匹配
在 xml 上重复的唯一节点是Series
节点。换句话说,Period
每个只有一个Series
,但有很多不同的Series
。
例如,获取Period
其Codeout
或CodeIn
值为 beC41073
且B85028
日期为 be 的所有节点2013-07-18
。
我尝试使用以下方法匹配多个名称:
//*[@v="C41073"] | //*[@v="B85028"] | ...
但是我认为如果只匹配正确的节点会更好,以防其他节点具有相同的值,不是吗?
我正在寻找使用“包含”之类的东西,但它以不同的方式工作。
我正在使用 .Net,如果这很重要,我将在.SelectNodes()
函数上使用这个 xPath。
编辑:
奇怪的事情正在发生。也许语法不正确。看看这个测试:
This:doc.SelectNodes("/*")(0).Name
正在返回RootName
This:doc.SelectNodes("/*/*").Count
正在返回912
This: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 序列中的每个元素节点名称之前添加。(有关它的更多信息,请参阅此内容:是否可以在 xpath 表达式中仅指定一次命名空间前缀?)