【问题标题】:Reading XML tags with XPath query使用 XPath 查询读取 XML 标记
【发布时间】:2020-04-29 20:50:36
【问题描述】:

我需要通过 XPath 查询从我在这里报告的 XML 文件中推断出一系列值。

我声明我对该主题知之甚少,因此对于技术术语的不准确之处,我深表歉意。 经过几次尝试后,我设法获得了一些对我有用的数据,例如 Idc-> FileGroup -> value 节点中报告的数据 用查询

//m:meta[2]/@value

它根据索引1,2,3等返回TAGs“值”的不同值。

尽管反复尝试,但我无法创建允许我获取以下 TAG 值的查询:Idc-> FileGroup-> File s: format-> Path

对应于docs/002678E3.pdf并来自TAG

IdC -> SelfDescription-ID s;

方案,对应

1520038843024

或者,对我来说也一样,

"local">1520038843024

你能帮我吗?
这是我的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<IdC xmlns="http://www.uni.com/U3011/sincro/" xmlns:s="http://www.uni.com/U3011/sincro/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.uni.com/U3011/sincro/ UNI1138600_2010_EIT.xsd http://andxor.it/tDoc/lotto.xsd lotto.xsd http://andxor.it/tDoc/metadata.xsd metadata.xsd">
  <SelfDescription>
    <ID s:scheme="local">1520038843024</ID>
    <CreatingApplication>
      <Name>tDoc</Name>
      <Version>r16610</Version>
      <Producer>Andxor Soluzioni Informatiche srl</Producer>
    </CreatingApplication>
    <MoreInfo s:XMLScheme="http://andxor.it/tDoc/lotto.xsd">
      <EmbeddedMetadata>
        <lotto xmlns="http://andxor.it/tDoc/lotto.xsd">
          <company>SCOTT</company>
          <doctype>FATTURE_ATTIVE</doctype>
          <period>2018</period>
          <previous id="1519174898489">ED1C84CE3A825268E8434EFB80B9D09B4E0E9658F7A4D4FF5005CE6D10293388</previous>
        </lotto>
      </EmbeddedMetadata>
    </MoreInfo>
  </SelfDescription>
  <VdC>
    <ID s:scheme="local">1520038843024</ID>
  </VdC>
  <FileGroup xmlns:m="http://andxor.it/tDoc/metadata.xsd">
    <File s:format="application/pdf">
      <ID s:scheme="local">2521309</ID>
      <Path>docs/002678DD.pdf</Path>
      <Hash s:function="SHA-256">A041E222FC3F968EAED07405D9D8A32CD2A8BDB1952E8B726DDE3B7F55F20EE0</Hash>
      <MoreInfo s:XMLScheme="http://andxor.it/tDoc/metadata.xsd">
        <EmbeddedMetadata>
          <m:metadata>
            <m:meta class="internal" name="Data inserimento" value="2018-02-16T18:40:12+01:00"/>
            <m:meta name="Numero Fattura" value="970081952"/>
            <m:meta name="Data" value="2018-02-01"/>
            <m:meta name="Ragione Sociale" value="SCOTT ITALIA AUTOFATTURA CORRISPETT"/>
            <m:meta name="Codice Cliente" value="140422"/>
            <m:meta name="Partita Iva" value="IT03770200164"/>
          </m:metadata>
        </EmbeddedMetadata>
      </MoreInfo>
    </File>
    <File s:format="application/pdf">
      <ID s:scheme="local">2521315</ID>
      <Path>docs/002678E3.pdf</Path>
      <Hash s:function="SHA-256">6FF865D8ECA154E31D9E362B12E11EA79CE04EB92EB558C7C0AAC32A5883156F</Hash>
      <MoreInfo s:XMLScheme="http://andxor.it/tDoc/metadata.xsd">
        <EmbeddedMetadata>
          <m:metadata>
            <m:meta class="internal" name="Data inserimento" value="2018-02-16T18:40:18+01:00"/>
            <m:meta name="Numero Fattura" value="970081953"/>
            <m:meta name="Data" value="2018-02-02"/>
            <m:meta name="Ragione Sociale" value="SCOTT ITALIA AUTOFATTURA CORRISPETT"/>
            <m:meta name="Codice Cliente" value="140422"/>
            <m:meta name="Partita Iva" value="IT03770200164"/>
          </m:metadata>
        </EmbeddedMetadata>
      </MoreInfo>
    </File>
    <File s:format="application/pdf">
      <ID s:scheme="local">2521321</ID>
      <Path>docs/002678E9.pdf</Path>
      <Hash s:function="SHA-256">0F3755FA764DD00AA35D801908A4FEE9762C259CE18E2DC6BFAD50C49B013422</Hash>
      <MoreInfo s:XMLScheme="http://andxor.it/tDoc/metadata.xsd">
        <EmbeddedMetadata>
          <m:metadata>
            <m:meta class="internal" name="Data inserimento" value="2018-02-16T18:40:22+01:00"/>
            <m:meta name="Numero Fattura" value="970081954"/>
            <m:meta name="Data" value="2018-02-05"/>
            <m:meta name="Ragione Sociale" value="SCOTT ITALIA AUTOFATTURA CORRISPETT"/>
            <m:meta name="Codice Cliente" value="140422"/>
            <m:meta name="Partita Iva" value="IT03770200164"/>
          </m:metadata>
        </EmbeddedMetadata>
      </MoreInfo>
    </File>
    <File s:format="application/pdf">
      <ID s:scheme="local">2521335</ID>
      <Path>docs/002678F7.pdf</Path>
      <Hash s:function="SHA-256">F3FE57B26F49065BCAEEC8B5B7DB58B8F9AE0E93ED692D8771D9116F5F6472C0</Hash>
      <MoreInfo s:XMLScheme="http://andxor.it/tDoc/metadata.xsd">
        <EmbeddedMetadata>
          <m:metadata>
            <m:meta class="internal" name="Data inserimento" value="2018-02-16T18:41:14+01:00"/>
            <m:meta name="Numero Fattura" value="970081955"/>
            <m:meta name="Data" value="2018-02-06"/>
            <m:meta name="Ragione Sociale" value="SCOTT ITALIA AUTOFATTURA CORRISPETT"/>
            <m:meta name="Codice Cliente" value="140422"/>
            <m:meta name="Partita Iva" value="IT03770200164"/>
          </m:metadata>
        </EmbeddedMetadata>
      </MoreInfo>
    </File>
  </FileGroup>
  <Process>
    <Agent s:type="organization" s:role="PreservationManager">
      <AgentName>
        <FormalName>KPNQwest Italia SpA</FormalName>
      </AgentName>
      <Agent_ID s:scheme="TaxCode">07957860153</Agent_ID>
    </Agent>
    <Agent s:type="person" s:role="PreservationManager">
      <AgentName>
        <NameAndSurname>
          <FirstName>Giuseppe</FirstName>
          <LastName>Baccanelli</LastName>
        </NameAndSurname>
      </AgentName>
      <Agent_ID s:scheme="TaxCode">BCCGPP64C01A940D</Agent_ID>
    </Agent>
    <Agent s:type="person" s:role="PreservationManager">
      <AgentName>
        <NameAndSurname>
          <FirstName>Giuseppe</FirstName>
          <LastName>Baccanelli</LastName>
        </NameAndSurname>
      </AgentName>
      <Agent_ID s:scheme="TaxCode">BCCGPP64C01A940D</Agent_ID>
    </Agent>
    <Agent s:type="organization" s:role="OtherRole" s:otherRole="Other role">
      <AgentName>
        <FormalName>Amministratore</FormalName>
      </AgentName>
    </Agent>
    <TimeReference>
      <TimeInfo>2018-03-03T02:00:43+01:00</TimeInfo>
    </TimeReference>
    <LawAndRegulations s:language="it">DPCM 3 dicembre 2013</LawAndRegulations>
  </Process>
</IdC>

【问题讨论】:

  • 关于术语的一点:XPath 不读取标签。标签是开始标签 (&lt;id&gt;) 或结束标签 (&lt;/id&gt;)。 XML 解析器使用标签来构造节点树;树中的元素节点具有从标记派生的名称,但标记本身在 XPath 搜索树时已经消失。 XPath 只看到命名节点,

标签: xml xpath


【解决方案1】:

您正在寻找的 XPath-1.0 表达式可能是

  1. 首先:“创建一个允许我获取以下 TAG 值的查询”:

    IdC -> 文件组 -> 文件:格式 -> 路径

    1. 简单

      /IdC/FileGroup/File[@s:format]/Path
      
    2. 如果必须显式设置命名空间,可以使用

      /std:IdC/std:FileGroup/std:File[@s:format='application/pdf']/std:Path
      

      命名空间设置为

      xmlns:std = "http://www.uni.com/U3011/sincro/" 
      xmlns:s   = "http://www.uni.com/U3011/sincro/"
      
    3. 或者,如果您根本无法设置命名空间(由于某种原因),请使用

      /*[local-name()='IdC']/*[local-name()='FileGroup']/*[local-name()='File'][@*[local-name()='format' and .='application/pdf']]/*[local-name()='Path']
      

    三种情况的结果都是

    docs/002678DD.pdf

  2. 要检索的值

    IdC -> 自我描述 -> ID

    使用这些 XPath-1.0 表达式:

    1. 使用上述命名空间:

      /std:IdC/std:SelfDescription/std:ID
      
    2. 没有上述命名空间:

      /*[local-name()='IdC']/*[local-name()='SelfDescription']/*[local-name()='ID']
      

    结果是两种情况:

    1520038843024

希望这会有所帮助。

【讨论】:

  • 你考虑过根元素的默认命名空间吗?
  • 由于 XPath 本身无法将命名空间前缀绑定到命名空间,因此请考虑在回答此类问题时参考规范 Q/A,其中涵盖了如何为多种语言和库执行此操作:@987654321 @
  • 仅供参考,OP 试图在您发布此答案后的第二天回复您,但他/她是在此处回复而不是在此处发表评论。如果您想阅读/回复,它在此页面上已删除的答案中。
  • @halfer:感谢您提及这一点。事实上,我没有注意到没有任何评论的答案中的回复。 (将一些 name() 更改为 local-name() 只是为了与根命名空间问题相关的完整性)
  • 不用担心。您可以随时通过问题下方的评论来 ping 他们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
相关资源
最近更新 更多