Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 按值选择文本节点_Xml_Xpath - Fatal编程技术网

Xml 按值选择文本节点

Xml 按值选择文本节点,xml,xpath,Xml,Xpath,鉴于希望使用XPath根据XML文本节点的值选择该节点,有没有比以下更好的方法: //*[text()="foo"]/text() 我假设有这样的情况: //text()[self="foo"] …但我不知道在XPath中,句号或点字符是self,也称为“上下文节点”,它是self 此查询 //text()[.="foo"] …将选择值为“foo”的所有文本节点。您通常已找到正确答案: //text()[.="foo"] 但是,请注意以下几点: 只要XML文档的结构是静态已知的,就应该

鉴于希望使用XPath根据XML文本节点的值选择该节点,有没有比以下更好的方法:

//*[text()="foo"]/text()
我假设有这样的情况:

//text()[self="foo"]

…但我不知道在XPath中,句号或点字符是self,也称为“上下文节点”,它是self

此查询

//text()[.="foo"]

…将选择值为“foo”的所有文本节点。

您通常已找到正确答案:

//text()[.="foo"] 
但是,请注意以下几点:

  • 只要XML文档的结构是静态已知的,就应该尽量避免使用XPath
    /
    伪运算符
    ,因为它的计算会导致遍历完整的子树(在最坏的情况下是完整的文档树),而且效率非常低。如果您知道所有文本节点都是
    c
    的子节点,并且文档中的所有
    c
    都可以由
    /a/b/c
    选择,请使用:
    /a/b/c/text()
    。如果您只知道所有文本节点都是
    c
    的后代,那么使用
    /a/b/c//text()
    /text()
    甚至比
    /c//text()
    更好

  • 文本节点通常包含我们通常不会注意到的空白。在这种情况下,需要写下:

    normalize-space(.) = 'foo'
    
    而不是

    . = 'foo'
    

  • 我认为*是个打字错误,是吗?@pguardiario确实是,是的。谢谢。回答得很好,但有一些特点需要考虑,例如多次不必要地使用
    /
    ,并且没有考虑周围的空白。您获得接受分数是因为:您确认了似乎有效的内容;你不是我;关于
    规范化空间
    的精彩注释。感谢(一如既往)分享您的XPath专业知识。