代码之家  ›  专栏  ›  技术社区  ›  Arun M R Nair

使用eXist数据库解析带有xpath和xquery的xml文件

  •  2
  • Arun M R Nair  · 技术社区  · 10 年前

    我需要去拿 <TITLE> 元素(我使用的是eXist数据库)。

    <?xml-stylesheet href="shakes.xsl" type="text/xsl"?>
    <!--!DOCTYPE PLAY PUBLIC "-//PLAY//EN" "play.dtd"-->
    <ClinicalDocument xmlns="urn:hl7-org:v3">
        <PLAY>
            <TITLE>The Tragedy of Hamlet, Prince of Denmark</TITLE>
        </PLAY>
    </ClinicalDocument >
    

    当我尝试使用下面的XQuery时,我没有得到预期的输出。

    xquery version "3.0";
    
    doc("/db/apps/demo/data/hamlet.xml")/ClinicalDocument/PLAY/TITLE
    

    我认为问题与 xmlns 属性存在于 <ClinicalDocument> 标签:

    <ClinicalDocument xmlns="urn:hl7-org:v3">
    

    如何修改XQuery以检索所需的XML元素?

    2 回复  |  直到 10 年前
        1
  •  1
  •   har07    10 年前

    声明映射到XML默认命名空间的前缀,并使用该前缀引用命名空间中的元素,如下所示:

    declare namespace d = "urn:hl7-org:v3";
    doc("/db/apps/demo/data/hamlet.xml")/d:ClinicalDocument/d:PLAY/d:TITLE
    

    此处测试: http://www.xpathtester.com/xquery/a88f300bbeacdbd846d7aec887d48a0b

        2
  •  1
  •   westbaystars    10 年前

    对于任何命名空间,都可以使用*通配符代替命名空间前缀。

    所以,如果你只是想要标题的文本,你可以这样做:

    doc("/db/apps/demo/data/hamlet.xml")/*:ClinicalDocument/*:PLAY/*:TITLE/text()
    

    不再需要定义命名空间。(尽管您会发现,从长远来看,使用带有名称空间的定义模式会使使用XQuery更好。)