ChatGPT解决这个技术问题 Extra ChatGPT

使用 XPath 获取属性

给定这样的 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>

对于第一个元素,我如何获得 lang 的值(其中 lang 是书名中的 eng)?


D
Dimitre Novatchev

对于第一个元素,我如何获得 lang 的值(其中 lang=eng 在书名中)?

利用:

/*/book[1]/title/@lang

这表示:

选择作为 XML 文档顶部元素的第一个 book 子元素的子元素的 title 元素的 lang 属性。

要仅获取此属性的字符串值,请使用标准 XPath 函数 string()

string(/*/book[1]/title/@lang)

@AbhishekAsthana,评估 XPath 表达式的结果恰好产生 lang 属性的字符串值。如果属性不包含任何方括号,则它们不会成为 XPath 表达式求值结果的一部分。我的猜测是这些是由您正在使用的(不适当的)工具添加的。
是的,我发现了问题..soapUI 就是这样显示它的,但是当我使用 xpath 值时,不使用这些括号。我已经看过很多次了。问题不在于工具......它位于椅子和键盘之间。
@KorayTugay,XPath 表达式 /*/book[1]/title/@lang 选择 0 个或多个属性节点的节点集,而 XPath 表达式 string(/*/book[1]/title/@lang) 在评估时生成此节点集的字符串值——和这是此节点集中第一个(按文档顺序)节点的字符串值。
@KorayTugay,不,第一个表达式selects,不会“返回”——一组节点,这组节点不是字符串。节点不是字符串——节点是中的节点。 XML 文档是一棵节点树。 lang="eng" 只是属性节点的众多文本表示之一,该属性节点具有名称“lang”,不属于命名空间,并且具有字符串值“eng”
@Vladimir,如果 v 对应于一个命名空间 uri,例如:“my:vvv”,那么可以在正在使用的 XPath 引擎的主机中创建一个映射,将 myPrefix(可能是 v,但不是必需的)关联到同一个命名空间-uri“我的:vvv”。然后将使用:title/@myPrefix:lang 选择属性。如何创建这样的映射是特定于实现的,必须阅读 XPath 引擎主机的文档。这是在 .NET 中以特定方式完成的,而在 Saxon 中则以另一种方式完成。如果您没有任何此类映射,请使用:title/@*[name()='v:lang']
M
Mathias Müller

谢谢!这解决了我在 Div 中的数据属性遇到的类似问题。

<div id="prop_sample" data-want="data I want">data I do not want</div>

使用此 xpath://*[@id="prop_sample"]/@data-want

希望这对其他人有帮助!


S
Sharath

您可以尝试以下 xPath 模式,

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")

这将选择 /bookstore/book 下的任何 XML 标题元素,这些元素的 lang 属性的值为 eng,而不是 lang 的值。即它选择元素列表,而不是单个属性
R
Royce

如果您使用的是 PostgreSQL,那么这是获取它的正确方法。这只是一个假设,因为您有一个包含填充数据的图书表 TITLE 和 PRICE 列。这是查询

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;

佚名

使用 XPath 提取属性值的标准公式是

elementXPath/@attributeName

所以这里是获取第一个属性的 lang 值的 xpath-

//title[text()='Harry Potter']/@lang

PS:从不建议在 XPath 中使用索引,因为如果再添加一个标题标签,它们可能会发生变化。


V
Vinod Srivastav

你也可以通过

string(//bookstore/book[1]/title/@lang)    
string(//bookstore/book[2]/title/@lang)

尽管如果您将 XMLDOM 与 JavaScript 一起使用,您可以编写类似的代码

var n1 = uXmlDoc.selectSingleNode("//bookstore/book[1]/title/@lang");

n1.text 将为您提供值 "eng"


s
starcwl

您可以使用:

(//@lang)[1]

这意味着您将获得名称等于“lang”的所有属性节点并获得第一个。


v
vtd-xml-author

这是使用 XPath 和 VTD-XML 获取“lang”属性值的片段。

import com.ximpleware.*;
public class getAttrVal {
    public static void main(String s[]) throws VTDException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false)){
            return ;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/bookstore/book/title/@lang");
        System.out.println(" lang's value is ===>"+ap.evalXPathToString());
    }
}

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅