2011-01-15 14 views
2

私は時々私が子供のタグとCdmCollectionsの値があることを見ることができるように機能複数の名前空間を変更してXMLを解析するには?

<?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> 

次のコードからアカウントデータを解析して取得しようとしている次のXMLを持っています。ただし、同じクエリに対しては常に機能しません。

生のXMLを見ると、名前空間が変更されていることがわかります。ときどきns2 = "http://www.intuit.com/sb/cdm/qbo"(作品)とそれ以外の時はns2 = "http://www.intuit.com/sb/cdm/v2"(doesnt work)です。私は名前空間配列を使用して、その問題を処理できると思ったが、動作していないと思った。どのように私はこれを修正することができますどのような提案?スキーマ内のバージョン変更を反映するために、名前空間URIを変更

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

答えて

1

は、人々がおよそ本当に賢い感じるが、それはほとんどの場合、本当に悪いアイデアだ、と彼らはよく知っているべきものです。これは、XMLのコンシューマーであることをより困難にするために設計されたものです。

理論上、ドキュメントを参照して、考慮する必要のある2つの名前空間の間に意味のある違いがあるかどうかを確認する必要があります。おそらくないでしょう。

あなたのアプローチは、URIよりも安定した名前空間接頭辞に依存しているため、かなり脆弱に見えます。実際には、おそらくそれはそうですが、それに頼るのは良い考えではありません。

名前空間のバリアントを扱うときは、ファイルを最初に変換して標準の名前空間を使用することをおすすめします。この場合、XML解析を実行する前に、単純なテキスト置換によってそれを行うようにしたいと思っています。

+0

マイケルに感謝します。奇妙なことは、ネームスペースが10分の間に数回スワップする可能性があるということです。とてもうるさい! – sweenrace

関連する問題