【问题标题】:Reading file XML with XPath query使用 XPath 查询读取文件 XML
【发布时间】:2021-07-07 16:10:53
【问题描述】:

早上好 我需要通过 XPath 查询从我在页面末尾报告的 XML 文件中推断出一系列值。

在架构的 FileGroup 级别之前,我能够获取我感兴趣的值,例如使用 //FileGroup/File/Path 之类的查询

但是,我无法读取 EmbeddedMetadata 节点中包含的数据

我尝试过各种方式,例如 // FileGroup / File / MoreInfo / EmbeddedMetadata / SubjectDestinatario / Denominazione 和其他人,但我没有得到正确的查询 特别是,阅读 Tag 中包含的值对我很有用,例如:

<FileNameOriginale> IT09533610011_173.xml </FileNameOriginale>

<SubjectDestinatario role = "Addressee" type = "organization">
   <Denomination> REWIND Srl </Denomination>

<MetadataAggiuntivi name = "NumeroDocumento"
   value = "2020047"

正是在这种情况下,我想阅读: IT09533610011_173.xml 倒带有限公司 2020047

提前非常感谢你会帮助我

<?xml version="1.0" encoding="utf-8"?>
<SIP url="http://www.archismall.com" version="1.0" xmlns:s="http://www.uni.com/U3011/sincro/">
    <SelfDescription>
        <ID s:scheme="local">IDVc9df21aa-f2f9-4345-a580-c8f777367adc1</ID>
        <CreatingApplication>
            <Name>ArchiSMALL</Name>
            <Version>1.12.2</Version>
            <Producer>Archivist SRL</Producer>
        </CreatingApplication>
    </SelfDescription>
    <VdV>
        <ID s:scheme="local">SIPc9df21aa-f2f9-4345-a580-c8f777367adc</ID>
    </VdV>
    <FileGroup>
        <File encoding="binary" format="text/xml">
            <ID s:scheme="local">a6b72ff7-4287-4f56-96d8-1da9a89d2316</ID>
            <Path>document/1/IT09533610011_173.xml</Path>
            <Hash function="SHA-256">6fb942e36b879764cb5cf95a2bffa3585f7f04155447ccc38d38441ed7dd6852</Hash>
            <MoreInfo xmlns="http://archismall.com/IDV_EmbeddedMetadata_XSD.xsd">
                <EmbeddedMetadata>
                    <FileNameOriginale>IT09533610011_173.xml</FileNameOriginale>
                    <IdDocumento s:scheme="local">a6b72ff7-4287-4f56-96d8-1da9a89d2316</IdDocumento>
                    <ImprontaDocumento function="SHA-256">6fb942e36b879764cb5cf95a2bffa3585f7f04155447ccc38d38441ed7dd6852</ImprontaDocumento>
                    <OggettoDocumento>Fattura Elettronica Passiva</OggettoDocumento>
                    <DataChiusura normal="+01">2021-01-07 12:41:38</DataChiusura>
                    <SoggettoProduttore role="Producer" type="organization">
                        <Denominazione>GEFIR IMMOBILIARE S.R.L.</Denominazione>
                        <PartitaIva scheme="VATRegistrationNumber">09533610011</PartitaIva>
                        <CodiceFiscale scheme="TaxCode">09533610011</CodiceFiscale>
                    </SoggettoProduttore>
                    <SoggettoDestinatario role="Addressee" type="person">
                        <Nome>Mario</Nome>
                        <Cognome>Infanti</Cognome>
                        <CodiceFiscale scheme="TaxCode">NFNMRA46R09F463G</CodiceFiscale>
                    </SoggettoDestinatario>
                    <SoggettoDestinatario role="Addressee" type="organization">
                        <Denominazione>REWIND Srl</Denominazione>
                        <PartitaIva scheme="VATRegistrationNumber"/>
                        <CodiceFiscale scheme="TaxCode">02406910352</CodiceFiscale>
                    </SoggettoDestinatario>
                    <MetadataAggiuntivi name="PeriodoEsercizio"
                        value="2020" xmlns="http://archismall.com/Metadata.xsd"/>
                    <MetadataAggiuntivi name="NumeroDocumento"
                        value="2020047" xmlns="http://archismall.com/Metadata.xsd"/>
                    <MetadataAggiuntivi name="DataDocumento"
                        value="2020-12-31" xmlns="http://archismall.com/Metadata.xsd"/>
                    <MetadataAggiuntivi name="TipoDocumento"
                        value="Fattura" xmlns="http://archismall.com/Metadata.xsd"/>
                    <MetadataAggiuntivi name="ProgressivoInvio"
                        value="173" xmlns="http://archismall.com/Metadata.xsd"/>
                    <MetadataAggiuntivi name="ResponsabileConservazione"
                        value="Mario Infanti" xmlns="http://archismall.com/Metadata.xsd"/>
                </EmbeddedMetadata>
            </MoreInfo>
        </File>
    </FileGroup>
    <Process>
        <Agent role="Producer" type="person">
            <AgentName>
                <NameAndSurname>
                    <FirstName>Mario</FirstName>
                    <LastName>Infanti</LastName>
                </NameAndSurname>
            </AgentName>
            <Agent_ID scheme="TaxCode">NFNMRA46R09F463G</Agent_ID>
        </Agent>
        <Agent role="Producer" type="organization">
            <AgentName>
                <FormalName>REWIND Srl</FormalName>
            </AgentName>
            <Agent_ID scheme="TaxCode">02406910352</Agent_ID>
        </Agent>
        <TimeReference>
            <TimeInfo normal="+01">2021-01-07 12:41:38</TimeInfo>
        </TimeReference>
    </Process>
</SIP>

【问题讨论】:

  • 您想要 XPath 还是 XQuery 解决方案?你是如何调用 XPath 的?你能声明命名空间吗?
  • XPath 1?还是2个或3个?在后面的版本中,您始终可以使用命名空间通配符,例如*:MoreInfo/*:EmbeddedMetadata/*:FileNameOriginale 用于命名空间中的那些元素。在 XPath 3 中,您甚至可以在路径中包含命名空间 URI,例如Q{http://archismall.com/IDV_EmbeddedMetadata_XSD.xsd}EmbeddedMetadata

标签: xml xpath xquery


【解决方案1】:

如果是 XPath 1,那么要么学习如何将前缀(例如 idv)绑定到您环境中的命名空间 http://archismall.com/IDV_EmbeddedMetadata_XSD.xsd,然后像在例如//idv:MoreInfo/idv:EmbeddedMetadata/idv:FileNameOriginale 选择该命名空间中的元素或选择本地名称,例如//*[local-name() = 'MoreInfo']/*[local-name() = 'EmbeddedMetadata']/*[local-name() = 'FileNameOriginale'].

XPath 2 或 3 始终可以使用命名空间通配符,例如//*:MoreInfo/*:EmbeddedMetadata/*:FileNameOriginale 用于命名空间中的那些元素。在 XPath 3 中,您甚至可以在路径的每个步骤中包含命名空间 URI,例如Q{http://archismall.com/IDV_EmbeddedMetadata_XSD.xsd}EmbeddedMetadata.

【讨论】:

    【解决方案2】:

    首先感谢您的友好回复 我有一个软件应用程序,必须通过输入正确的 xpath 查询进行设置,以获取稍后将写入数据库的数据的提取 该软件还允许您声明名称空间,但实际上我并不确切知道如何管理此功能,所以如果可能的话我宁愿不必使用它 不幸的是,要回答大卫的问题,我不知道这个应用程序可以支持什么级别的 Xpath,据我所知,我可以说它采用了以下链接中 xpath 测试器支持的相同语法

    https://codebeautify.org/Xpath-Tester

    我在测试器中尝试在这个 XML 文件上使用建议的字符串,我写了

    *: MoreInfo / *: EmbeddedMetadata / *: 原始文件名

    但显然不成功,因为我没有返回任何值

    也许我在准确编写查询时犯了一个错误?

    也许您可以根据提供的信息给我进一步的帮助?

    非常感谢

    【讨论】:

    • 您的 xpath 表达式中有空格(并且节点名称错误);试试://*:MoreInfo/*:EmbeddedMetadata//*:FileNameOriginale/text().
    【解决方案3】:

    我确认问题已解决,尤其是在我的情况下,这种查询结构对我很有用:

    //[local-name() ='MoreInfo']/[local-name()='EmbeddedMetadata']/*[local-name() = 'FileNameOriginale'] p>

    使用相同的语法,我得到了 EmbeddedMetadata 组的更多数据,即使没有指定命名空间

    还可以使用以下表达式读取后续节点,例如:

    //*[local-name()='AdditionalMetadata'][@name="DocumentNumber"]/@value

    非常感谢大家的宝贵帮助

    朋友们玩得开心

    再见

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2022-01-04
      • 2023-04-03
      相关资源
      最近更新 更多