2013-10-28 2 views
2

У меня есть веб-сервис, который возвращает XML в следующем формате. Я использую XML :: LibXML для анализа вывода.разбор XML с использованием perl 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> 

и я не могу понять, как добраться до узла ChemicalSubstanceIdentification в XML. Мой код:

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'); 

Что-то не так с тем, что я делаю. Любая помощь приветствуется. Благодаря!

ответ

3

Первые элементы пары на вашем XPath находятся в пространстве имен http://www.exchangenetwork.net/schema/node/2 в вашем XML-документе. Вам нужно будет указать это пространство имен для элементов QueryResponse и Results для работы вашего XPath.

С другой стороны, если есть только один SRS:SubstanceInformation в Results в любом случае, вы можете просто пропустить QueryResponse и Results через //:

//SRS:SubstanceInformation/SRS:ChemicalSubstance/SRS:ChemicalSubstanceIdentification 
Смежные вопросы