3

如何使用复杂条件在 Xpath 中获取元素?

例如:

<?xml version="1.0" encoding="UTF-8"?>
<stock xmlns="http://localhost/aaabbb">
<item item-id="1">
 <name xml:format="short">This is a short name</name>
 <name xml:format="long">This is a LONG name</name>
</item>
</stock>

目标:获取标签的文本 WHERE xml:format="long"。

在此先感谢您的帮助!

4

3 回答 3

6

看看这个:http ://www.w3schools.com/xpath/xpath_syntax.asp 。您要求的示例:

XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore> 

XPATH:

//title[@lang='eng']    Selects all the title elements that have an attribute named lang with a value of 'eng'

所以你应该这样做:

//name[@xml:format='long']
于 2012-06-10T08:03:35.460 回答
1

在您的特定情况下,XML 文档不在默认命名空间中,因此 XPath 表达式如下:

/stock/item/name

不选择任何节点

使用

/*/*/*[name()='name' and @xml:format = 'long']/text()

或使用

string(/*/*/*[name()='name' and @xml:format = 'long'])

第一个表达式选择所有元素的所有文本子节点,其名称为name(无论名称空间如何)并且是 XML 文档中顶部元素的孙子节点。

第二个表达式生成 XML 文档中第一个元素的字符串值,使其名称为name(无论名称空间如何),并且它是 XML 文档中顶部元素的孙子元素。

基于 XSLT 的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select="/*/*/*[name()='name' and @xml:format = 'long']/text()"/>
===========
     <xsl:copy-of select="string(/*/*/*[name()='name' and @xml:format = 'long'])"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<stock xmlns="http://localhost/aaabbb">
    <item item-id="1">
        <name xml:format="short">This is a short name</name>
        <name xml:format="long">This is a LONG name</name>
    </item>
</stock>

计算两个 Xpath 表达式,并将选定元素(第一个)和生成的字符串结果(第二个)复制到输出

This is a LONG name
===========
This is a LONG name
于 2012-06-10T14:24:58.257 回答
0

具有以下 XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<stock xmlns="http://localhost/aaabbb">
<item item-id="1">
 <name xml:format="short">This is a short name</name>
 <name xml:format="long">This is a LONG name</name>
</item>
</stock>

首先指定xPath节点列表的:

XmlNodeList nodeList = root.SelectNodes("/stock/item");

第二个指定您想要的列表的哪个名称节点:(具有“长”属性值的节点)

XmlNode name = nodeList.Item(0).SelectSingleNode(string.Format("/stock/item/name[@xml:format="Long"]"));

第三次检索该节点内的文本:

string result = name.InnerText;
于 2012-08-16T11:24:12.393 回答