【问题标题】:What is a multi branch xpath query for finding this?什么是用于查找此内容的多分支 xpath 查询?
【发布时间】:2012-12-05 19:02:39
【问题描述】:

这是我当前的 xpath 查询:

//node:Expr_Assign[subNode:var/node:Expr_Variable/subNode:Name/scalar:string='my_chinese_surname' and subNode:expr/node:Scalar_String/subNode:value/scalar:string='Qiu']

我试图在这个 xml 中找到它:

<?xml version="1.0" encoding="UTF-8"?>
<AST xmlns:node="http://nikic.github.com/PHPParser/XML/node" xmlns:subNode="http://nikic.github.com/PHPParser/XML/subNode" xmlns:attribute="http://nikic.github.com/PHPParser/XML/attribute" xmlns:scalar="http://nikic.github.com/PHPParser/XML/scalar">
 <scalar:array>
  <node:Expr_Assign>
   <attribute:startLine>
    <scalar:int>2</scalar:int>
   </attribute:startLine>
   <attribute:endLine>
    <scalar:int>2</scalar:int>
   </attribute:endLine>
   <subNode:var>
    <node:Expr_Variable>
     <attribute:startLine>
      <scalar:int>2</scalar:int>
     </attribute:startLine>
     <attribute:endLine>
      <scalar:int>2</scalar:int>
     </attribute:endLine>
     <subNode:name>
      <scalar:string>my_chinese_surname</scalar:string>
     </subNode:name>
    </node:Expr_Variable>
   </subNode:var>
   <subNode:expr>
    <node:Scalar_String>
     <attribute:startLine>
      <scalar:int>2</scalar:int>
     </attribute:startLine>
     <attribute:endLine>
      <scalar:int>2</scalar:int>
     </attribute:endLine>
     <subNode:value>
      <scalar:string>Qiu</scalar:string>
     </subNode:value>
    </node:Scalar_String>
   </subNode:expr>
  </node:Expr_Assign>
 </scalar:array>
</AST>

目前不工作。事实上我什至不能选择标量:数组。

查询有什么问题?

我认为这是命名空间。但是我无法注册它们,网址已经死了? http://nikic.github.com/PHPParser/XML/node 这不会导致任何地方。

【问题讨论】:

    标签: xml xpath domxpath


    【解决方案1】:

    应该是:

    //node:Expr_Assign[subNode:var/node:Expr_Variable/subNode:name/scalar:string='my_chinese_surname' and subNode:expr/node:Scalar_String/subNode:value/scalar:string='Qiu']
    

    注意subNode:namesubNode:Name

    但我是否可以建议这样的表达式可能更具可读性,尽管根据 XML 的其余部分看起来我无法判断它是否会完全按照您想要的方式工作

    //node:Expr_Assign[.//scalar:string='my_chinese_surname'][ .//scalar:string='Qiu']
    

    另请注意,命名空间 URI 不是 URL,它们不需要可解析才能使用。 URL 格式通常用于命名空间 URI,因为通常拥有该域,因此可以合理地确定其他人不会通过在该域中使用命名空间 URI 来创建命名空间冲突。命名空间 URI 可以很容易地成为 urn、uuid 或电子邮件地址。

    【讨论】:

    • 嘿,当我测试你的第一行 xpath 时,它仍然无法正常工作:xpath.online-toolz.com/tools/xpath-editor.php 我想我需要解析命名空间。这将如何运作?
    • 哦,它现在可以工作了,即使它在在线测试仪上失败了。然而输出是这样的: 2222my_chinese_surname22Qiu 为什么会这样?那些 2 来自标量:int?如何确定我应该得到什么样的输出?
    • 其实你知道在值上进行通配符搜索的操作符是什么吗?就像在这部分 (scalar:string='my_chinese_surname') 可以是 (scalar:string=*) 吗?什么是通配符?
    • 如果你想匹配而不考虑内容,只需删除=...//node:Expr_Assign[.//scalar:string][ .//scalar:string] 如果这些元素存在则成功。如果你想确保他们有文本,你可以这样做://node:Expr_Assign[.//scalar:string/text()][ .//scalar:string/text()] 如果你想确保他们有非空白文本,你可以这样做://node:Expr_Assign[.//scalar:string/text()[normalize-space()]][ .//scalar:string/text()[normalize-space()]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    相关资源
    最近更新 更多