【发布时间】:2013-07-18 11:54:37
【问题描述】:
我有一个如下所示的 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或CodeIn,但只能是其中之一 -
TimePeriod上的日期必须匹配
在 xml 中重复的唯一节点是 Series 节点。也就是说,每个Series只有一个Period,但有很多不同的Series。
例如,获取所有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")
并在 xPath 序列中的每个元素节点名称之前添加 ns:。 (有关它的更多信息,请参阅此:Is it possible to specify the namespace prefix just once in a xpath expression?)
【问题讨论】:
-
TimePeriod元素上的v属性的值似乎不是标准的 xml 数据类型值。我认为这是用斜线分隔的两个日期/时间值(开始时间和结束时间)? -
是的。我所做的是使用
/进行拆分。我不知道 xPath 是否可行,我现在正在寻找它。 -
你必须使用 XPath 吗?为什么不使用 Linq to XML?
-
我使用的是 Net Framework 2.0