2011-01-15 5 views
2

나는 내가 다음 코드는 때때로 내가 볼 수 있도록 작업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이 그 아이 태그와 CdmCollections의 값. 그러나, 그것은 항상 동일한 쿼리에 대해 작동하지 않습니다.

원시 XML을 보면 네임 스페이스가 변경된 것을 볼 수 있습니다. 때때로 ns2 = "http://www.intuit.com/sb/cdm/qbo"(작동) 및 다른 시간 ns2 = "http://www.intuit.com/sb/cdm/v2"(나던 작동). 네임 스페이스 배열을 사용하여 그 문제를 처리 할 수 ​​있지만 작동하지 않는다고 생각했습니다. 이 문제를 어떻게 해결할 수 있을지 제안 해 주시겠습니까? 스키마의 버전 변화를 반영하기 위해 네임 스페이스 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을 사용하는 사용자를 어렵게하기 위해 설계된 것입니다.

이론적으로 고려해야 할 두 가지 네임 스페이스 사이에 의미있는 차이가 있는지 여부를 확인하려면 설명서를 참조해야합니다. 아마 거기에 없습니다.

URI보다 안정적인 네임 스페이스 접두사를 사용하기 때문에 접근 방법이 매우 약해 보입니다. 실용적으로, 어쩌면 그것 일지 모르지만, 그것에 의지하는 것은 좋은 생각이 아닙니다.

보통 네임 스페이스 변형을 처리 할 때는 파일을 먼저 변환하여 표준 네임 스페이스를 사용하는 것이 좋습니다. 이 경우에는 XML 구문 분석을하기 전에 간단한 텍스트 대체로이 작업을 수행하고 싶습니다.

+0

감사합니다. Michael. 이상한 점은 네임 스페이스가 10 분 동안 두 번 스왑 될 수 있다는 것입니다. 매우 짜증나! – sweenrace

관련 문제