【问题标题】:Namespace resolver supporting default namespace in xml to evaluate xpath命名空间解析器支持 xml 中的默认命名空间来评估 xpath
【发布时间】:2022-01-09 16:29:23
【问题描述】:

我的 XML 文档开头如下:

<?xml version='1.0' encoding='UTF-8'?>
<article  xmlns:d="http://docbook.org/ns/docbook"
          xmlns="http://docbook.org/ns/docbook"
          version="5.0">
<info>
 <title>My title</title>
 <annotation>
   <segmentedlist>
     <segtitle>role</segtitle>
     <segtitle>id</segtitle>
     <segtitle>description</segtitle>
     <seglistitem>
       <seg>input</seg>
       <seg>hash123</seg>
       <seg>INPUT</seg>
     </seglistitem>
   </segmentedlist>
  </annotation>
 </info>
 <simpara/>
</article>

我需要使用 xpath 查询来查找元素,例如:

var inputList = currentDocument.evaluate("//annotation/segmentedlist/seglistitem/seg",
                                          currentDocument,
                                          null,
                                          XPathResult.ANY_TYPE,null);

由于默认命名空间 xmlns="http://docbook.org/ns/docbook" 关联到另一个显式命名空间,因此命名空间解析器在评估 xpath 表达式时失败。

据我了解https://developer.mozilla.org/en-US/docs/Web/XPath/Introduction_to_using_XPath_in_JavaScript#implementing_a_default_namespace_resolver 中的注释,没有简单的模式可以通过这样的命名空间声明来支持“普通 xpath 表达式”。 使用“namespace-uri()=[...]”的建议解决方案似乎使 xpath 表达式复杂化。

有人想提出一个模式吗?

【问题讨论】:

    标签: javascript xml xpath namespaces


    【解决方案1】:

    将 XPath 3.1 与 Saxon-JS 2 (https://www.saxonica.com/saxon-js/documentation2/index.html) 一起使用:

    const xml = `<?xml version='1.0' encoding='UTF-8'?>
    <article  xmlns:d="http://docbook.org/ns/docbook"
              xmlns="http://docbook.org/ns/docbook"
              version="5.0">
    <info>
     <title>My title</title>
     <annotation>
       <segmentedlist>
         <segtitle>role</segtitle>
         <segtitle>id</segtitle>
         <segtitle>description</segtitle>
         <seglistitem>
           <seg>input</seg>
           <seg>hash123</seg>
           <seg>INPUT</seg>
         </seglistitem>
       </segmentedlist>
      </annotation>
     </info>
     <simpara/>
    </article>`;
    
    const xmlDoc = new DOMParser().parseFromString(xml, 'application/xml');
    
    const segElements = SaxonJS.XPath.evaluate('//annotation/segmentedlist/seglistitem/seg', xmlDoc , { 'xpathDefaultNamespace' : 'http://docbook.org/ns/docbook' });
    
    console.log(segElements.length, segElements);
    &lt;script src="https://www.saxonica.com/saxon-js/documentation2/SaxonJS/SaxonJS2.rt.js"&gt;&lt;/script&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-23
      • 2010-10-07
      • 2022-01-20
      • 2011-10-09
      • 1970-01-01
      • 2014-02-06
      • 2010-11-08
      相关资源
      最近更新 更多