1

想象以下 XML 文档:

<root>
    <person_data>
        <person>
            <name>John</name>
            <age>35</age>
        </person>
        <person>
            <name>Jim</name>
            <age>50</age>
        </person>
    </person_data>
    <locations>
        <location>
            <name>John</name>
            <country>USA</country>
        </location>
        <location>
            <name>Jim</name>
            <country>Japan</country>
        </location>
    </locations>
</root>

然后我为 Jim 选择人员节点:

XmlNode personNode = doc.SelectSingleNode("//person[name = 'Jim']");

现在从这个节点中选择一个 XPath,我想检索 Jim 的位置节点。就像是:

XmlNode locationNode = personNode.SelectSingleNode("//location[name = {reference to personNode}/name]");

由于我是基于 personNode 进行选择的,所以如果我可以在选择中引用它会很方便。这可能吗?...那里有联系吗?

当然,我可以添加几行额外的代码并将名称放入变量中,然后在 XPath 字符串中使用它,但这不是我要问的。

4

5 回答 5

3

这不是很有效,但它应该工作。文件越大,速度越慢。

string xpath = "//location[name = //person[name='Jim']/name]";
XmlNode locationNode = doc.SelectSingleNode(xpath);

这就是效率低下的原因:

  • " //" 简写会导致对所有节点进行文档范围的扫描。
  • " []" 谓词在循环中运行,每个<person>与 " //person" 匹配一次。
  • 第二个 " //" 导致 a 再次导致文档范围的扫描,这次每个<person>.

这意味着您将获得二次 O(n²) 最坏情况下的性能,这很糟糕。如果您的文档中有 n <person>s 和 n <location>s,则会发生 nxn 文档范围扫描。全部来自一个看起来很无辜的 XPath 表达式。

我建议不要使用这种方法。两步选择(首先,找到人,然后是位置)会表现得更好。

于 2009-06-05T14:30:35.810 回答
1

您不是根据节点选择location节点person,而是根据节点的选择它。该值只是一个字符串,在这种情况下,它可用于制定谓词条件,location根据 ("Jim") 中的值选择节点。

于 2009-06-05T14:03:48.407 回答
1

我不太确定您为什么要从personNode. 由于节点中已经存在该名称,因此location您可以很好地使用它来获取与“Jim”相对应的位置节点。

XPath would be: //location[name = 'Jim']
于 2009-06-05T14:08:28.320 回答
0
XmlNode locationNode = personNode.SelectSingleNode(".."); 

应该这样做。

于 2009-08-19T13:35:41.190 回答
0

我很欣赏您真正的 XML 文档比您的示例更复杂,但有一件事确实让我印象深刻。它类似于包含以下内容的关系数据存储:

  • 一个person有两列的表 -nameage
  • 一个location有两列的表 -namecountry
  • name连接在两列上的两个表之间的 1-1 关系。

考虑到这一点,XPath 变得显而易见。您只需选择所需数据的表的主键值。

//location[name = 'Jim']

我知道 aJ 已经提出了那个解决方案,但它被拒绝了,但是如果你将这个想法推广到真正的 XML 模式,你会得到:

//real_2nd_table_name[real_2nd_pk_column_name_1 = real_1st_pk_column_value_1 and real_2nd_pk_column_name_2 = real_1st_pk_column_value_2 and real_2nd_pk_column_name_3 = real_1st_pk_column_value_3 ...]

换句话说:

  1. 您已经知道用于在第一个表中查找行的 PK 值。
  2. 你知道这两个表是如何相关的。
  3. 因此,您应该能够弄清楚如何使用与在第一个表中选择行相同的值来表达对第二个表的 PK 查询。
于 2010-03-23T13:38:27.610 回答