5

我想找到具有此文本的确切节点:“公司”。到达该节点后,我想立即到达该节点之后的下一个文本节点,因为它包含公司名称。我怎样才能用 Xpath 做到这一点?

XML的片段是:

<div id="jobsummary">
    <div id="jobsummary_content">
        <h2>Job Summary</h2>
        <dl>
            <dt>Company</dt>
            <!-- the following element is the one I'm looking for -->
            <dd><span class="wrappable">Pinpoint IT Services, LLC</span></dd>
            <dt>Location</dt>
            <dd><span class="wrappable">Newport News, VA</span></dd>
            <dt>Industries</dt>
            <dd><span class="wrappable">All</span></dd>
            <dt>Job Type</dt>
            <dd class="multipledd"><span class="wrappable">Full Time</span></dd><dd class="multipleddlast"><span class="wrappable"> Employee</span></dd>
        </dl>
    </div>
</div>

我使用以下 xpath 到达 Company 标签://*[text()= 'Company'] 现在我想到达下一个文本节点。我的 XML 是动态的。所以我不能像<dd>获取公司价值那样对节点类型进行硬编码。但这可以肯定该值在紧邻的下一个文本节点中。

那么如何在文本为 Company 的节点之后立即到达文本节点?

4

4 回答 4

3

如果您无法对following-sibling节点的任何部分进行硬编码,您的 xpath 应如下所示:

//*[text()='Company']/following::*/*/text()

假设所需的文本始终包含在另一个元素中,例如span.


要测试给定的dt文本,请将您的 xpath 修改为

//*[text()='Company' or text()='Company:' or text()='Company Name']/following::*/*/text()
于 2012-06-08T07:49:16.900 回答
0

使用这个通用 XPath 表达式来选择所需的文本节点,即使它包含在静态未知的标记元素中

(//*[text()='Company']/following-sibling::*[1]//text())[1]

当根据提供的 XML 文档评估此 XPath 表达式时

<div id="jobsummary">
    <div id="jobsummary_content">
        <h2>Job Summary</h2>
        <dl>
            <dt>Company</dt>
            <!-- the following element is the one I'm looking for -->
            <dd><span class="wrappable">Pinpoint IT Services, LLC</span></dd>
            <dt>Location</dt>
            <dd><span class="wrappable">Newport News, VA</span></dd>
            <dt>Industries</dt>
            <dd><span class="wrappable">All</span></dd>
            <dt>Job Type</dt>
            <dd class="multipledd"><span class="wrappable">Full Time</span></dd><dd class="multipleddlast"><span class="wrappable"> Employee</span></dd>
        </dl>
    </div>
</div>

正是选择了想要的文本节点

Pinpoint IT Services, LLC

即使我们将 XML 更改为这个

<div id="jobsummary">
    <div id="jobsummary_content">
        <h2>Job Summary</h2>
        <div>
            <p>Company</p>
            <!-- the following element is the one I'm looking for -->
            <dd><span class="wrappable"><b><i><u>Pinpoint IT Services, LLC</u></i></b></span></dd>
            <dt>Location</dt>
            <dd><span class="wrappable">Newport News, VA</span></dd>
            <dt>Industries</dt>
            <dd><span class="wrappable">All</span></dd>
            <dt>Job Type</dt>
            <dd class="multipledd"><span class="wrappable">Full Time</span></dd><dd class="multipleddlast"><span class="wrappable"> Employee</span></dd>
        </div>
    </div>
</div>

上面的 XPath 表达式仍然选择想要的文本节点:

Pinpoint IT Services, LLC
于 2012-06-08T12:34:29.953 回答
0

用于//*[text()='Company']/following-sibling::dd获取下一个 dd。

您甚至可以为该 dd 插入条件并在其中走得更远。 following-sibling::elementName只需在满足您要求的同一父级别查找下一个兄弟姐妹。在没有条件的情况下,像上面一样,它将获得 'Company' 之后的下一个 dd。

文本在跨度中,因此您可以尝试

//*[text()='Company']/following-sibling::dd/span

另一个明确的例子是,假设您还想获取当前选定的“公司”的下一个行业文本。

//*[text()='Company'

你可以像这样修改它://*[text()='Company']/following-sibling::dt[text()='Industries']/dd/span

当然,您可以使用变量,而不是硬编码 text() 的值。

于 2012-06-08T07:42:09.490 回答
0

您可以使用 XPathNavigator 并逐个处理每个节点类型

我认为 XPathNavigator::MoveToNext 是您正在寻找的方法。

也有示例代码。 http://msdn.microsoft.com/en-us/library/9yxc3x24.aspx

于 2012-06-08T08:03:07.233 回答