xml - 使用 perl XML::LibXML 解析 XML

标签 xml perl xml-libxml

我有一个 Web 服务,它返回以下格式的 XML。我正在使用 XML::LibXML 来解析输出。

<QueryResponse xmlns="http://www.exchangenetwork.net/schema/node/2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <LastSet>true</LastSet>
    <Results>
        <SRS:SubstanceInformation xsi:schemaLocation="http://www.exchangenetwork.net/schema/SRS/3 http://www.exchangenetwork.net/schema/SRS/3" xmlns:SRS="http://www.exchangenetwork.net/schema/SRS/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <SRS:ChemicalSubstance>
                <SRS:ChemicalSubstanceIdentification>
                    <SRS:EPAChemicalInternalNumber>76109</SRS:EPAChemicalInternalNumber>
                    <SRS:CASRegistryNumber>1000-82-4</SRS:CASRegistryNumber>
                    <SRS:ChemicalSubstanceSystematicName>Urea, N-(hydroxymethyl)-</SRS:ChemicalSubstanceSystematicName>
                    <SRS:EPAChemicalRegistryName>Methylolurea</SRS:EPAChemicalRegistryName>
                    <SRS:EPAChemicalIdentifier/>
                    <SRS:ChemicalSubstanceDefinitionText/>
                    <SRS:ChemicalSubstanceCommentText/>
                    <SRS:MolecularFormulaCode>C2H6N2O2</SRS:MolecularFormulaCode>
                    <SRS:ChemicalSubstanceFormulaWeightQuantity>90.08</SRS:ChemicalSubstanceFormulaWeightQuantity>
                    <SRS:ChemicalSubstanceLinearStructureCode>O=C(NCO)N</SRS:ChemicalSubstanceLinearStructureCode>
                    <SRS:InternationalChemicalIdentifier/>
                    <SRS:FormerCASRegistryNumberList/>
                    <SRS:IncorrectlyUsedCASRegistryNumberList>
                        <SRS:CASRegistryNumber>50-00-0</SRS:CASRegistryNumber>
                    </SRS:IncorrectlyUsedCASRegistryNumberList>
                    <SRS:ClassificationList/>
                    <SRS:TechnicalPointOfContact/>
                    <SRS:SubstanceRequestor/>
                    <SRS:SubstanceCreateDate>2006-10-13 14:30:12.0</SRS:SubstanceCreateDate>
                    <SRS:SubstanceLastUpdateDate>2010-01-20 12:29:21.0</SRS:SubstanceLastUpdateDate>
                    <SRS:SubstanceStatus>A</SRS:SubstanceStatus>
                </SRS:ChemicalSubstanceIdentification>
                <SRS:ChemicalSubstanceSynonymList>
                    <SRS:ChemicalSubstanceSynonym>
                        <SRS:ChemicalSubstanceSynonymName>Urea, (hydroxymethyl)-</SRS:ChemicalSubstanceSynonymName>
                        <SRS:ChemicalSynonymStatusName>Reviewed</SRS:ChemicalSynonymStatusName>
                        <SRS:ChemicalSynonymSourceName>Chemical Update System (CUS) 1986</SRS:ChemicalSynonymSourceName>
                        <SRS:RegulationReasonText/>
                        <SRS:CharacteristicList/>
                        <SRS:AlternateIdentifierList/>
                    </SRS:ChemicalSubstanceSynonym>
                </SRS:ChemicalSubstanceSynonymList>
            </SRS:ChemicalSubstance>
        </SRS:SubstanceInformation>
    </Results>
    <RowCount>1</RowCount>
    <RowId>0</RowId>
</QueryResponse>

我不知道如何访问 XML 中的 ChemicalSubstanceIdentification 节点。我的代码是

my $parser = XML::LibXML->load_xml(location => 'output.xml');

my $doc = XML::LibXML::XPathContext->new($parser);
$doc->registerNs('SRS', 'http://www.exchangenetwork.net/schema/SRS/3');
my $chemIdent = $doc->findnodes('/QueryResponse/Results/SRS:SubstanceInformation/SRS:ChemicalSubstance/SRS:ChemicalSubstanceIdentification');

我正在做的事情有问题吗?任何帮助表示赞赏。谢谢!

最佳答案

XPath 上的前几个元素位于 XML 文档的 http://www.exchangenetwork.net/schema/node/2 命名空间中。您必须为 QueryResponseResults 元素指定 namespace ,XPath 才能正常工作。

或者,如果 Results 中只有一个 SRS:SubstanceInformation,您可以跳过 QueryResponseResults 通过 //:

//SRS:SubstanceInformation/SRS:ChemicalSubstance/SRS:ChemicalSubstanceIdentification

关于xml - 使用 perl XML::LibXML 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19626712/

相关文章:

c# - 如何根据节点将 XML 文件拆分为多个 XML 文件

html - 是否有必要同时包括html和xml?

java - 什么是 XML BOM 以及如何检测它?

perl - 如何在 Pane 中立即查看 Lokalize 中的消息上下文?

perl - XML::LibXML - 检测两个元素是否相同?

xml - Scala XML 中的选项 [Elem]

multithreading - 如何在线程之间共享 LWP::UserAgent 对象

regex - 如何处理 Perl 正则表达式中的特殊字符?

perl - 如何使用 XML::LibXML 实际修改 XML 文件的值

XML::LibXML 的文本节点父节点概念