2011-01-15 8 views
2

Ich habe den folgenden XML-Code, ich versuche, die Kontodaten vonWie kann man XML mit mehreren sich ändernden Namespaces analysieren?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:SearchResults xmlns="http://www.intuit.com/sb/cdm/v2" xmlns:ns2="http://www.intuit.com/sb/cdm/qbo" xmlns:ns3="http://www.intuit.com/sb/cdm/qbopayroll/v1"> 
    <ns2:CdmCollections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Accounts"> 
     <Account> 
      <Id idDomain="QBO">31</Id> 
      <SyncToken>0</SyncToken> 
      <MetaData> 
       <CreateTime>2010-02-16T18:03:50-08:00</CreateTime> 
       <LastUpdatedTime>2010-02-16T18:03:50-08:00</LastUpdatedTime> 
      </MetaData> 
      <Name>Accounts Payable</Name> 
      <Subtype>AccountsPayable</Subtype> 
      <CurrentBalance>34002.00</CurrentBalance> 
     </Account> 
     <Account> 
      <Id idDomain="QBO">36</Id> 
      <SyncToken>0</SyncToken> 
      <MetaData> 
       <CreateTime>2011-01-11T13:24:14-08:00</CreateTime> 
       <LastUpdatedTime>2011-01-11T13:24:14-08:00</LastUpdatedTime> 
      </MetaData><Name>Accounts Receivable (A/R)</Name> 
      <Subtype>AccountsReceivable</Subtype> 
      <CurrentBalance>1125.85</CurrentBalance> 
     </Account> 
    </ns2:CdmCollections> 
    <ns2:Count>10</ns2:Count> 
    <ns2:CurrentPage>1</ns2:CurrentPage> 
</ns2:SearchResults> 

Der folgenden Code manchmal zu analysieren und erhalten arbeiten, so dass die ich, dass Kinder Tags und Werte von CdmCollections sehen kann. Es funktioniert jedoch nicht immer für die gleiche Abfrage.

Mit Blick auf das rohe Xml kann ich die Namespaces ändern, z. manchmal ns2 = "http://www.intuit.com/sb/cdm/qbo" (funktioniert) und zu anderen Zeiten ns2 = "http://www.intuit.com/sb/cdm/v2" (funktioniert nicht). Ich dachte, mit dem Namespaces-Array könnte ich das Problem behandeln, aber es funktioniert nicht. Irgendwelche Vorschläge, wie ich das beheben kann?

$account_xml = new SimpleXMLElement($account_query_response); 


$namespaces = $account_xml->getNamespaces(true); 
$account_xml->registerXPathNamespace('c', $namespaces["ns2"]); 

$x = 0; 
foreach($account_xml->xpath('//c:SearchResults') as $search) { 
    echo "<br>row " . $x; 
    $search->registerXPathNamespace('c', $namespaces["ns2"]); 

    var_dump($search->xpath('//c:CdmCollections')); 
} 

Antwort

1

einen Namespace-URI ändern im Schema eine Version Änderung widerzuspiegeln ist etwas, das Menschen über wirklich klug fühlen, aber es ist eine wirklich schlechte Idee in den meisten Fällen, und sie sollten es besser wissen. Es ist nur so konzipiert, dass es für Sie, den Konsumenten von XML, schwieriger wird.

Theoretisch sollten Sie in der Dokumentation nachsehen, ob zwischen den beiden Namespaces ein sinnvoller Unterschied besteht, den Sie berücksichtigen müssen. Wahrscheinlich gibt es das nicht.

Ihr Ansatz sieht ziemlich fragil aus, da er sich darauf verlässt, dass die Namespacepräfixe stabiler sind als die URIs. Pragmatisch vielleicht, aber es ist keine gute Idee, sich darauf zu verlassen.

Meine übliche Empfehlung beim Umgang mit Namespace-Varianten besteht darin, die Datei zuerst in einen Standard-Namespace umzuwandeln. In diesem Fall wäre ich sehr versucht, dies durch eine einfache Textersetzung vor der XML-Analyse zu tun.

+0

Danke Michael. Das Merkwürdige ist, dass der Namespace einige Male innerhalb von 10 Minuten ausgetauscht werden kann. Sehr nervig! – sweenrace