2013-07-31 3 views
0

Я извлекаю информацию о клиенте с удаленного сервера и создаю xml-файл на своем веб-сайте, который будет обрабатываться для веб-страницы. Используя этот код:проблема разбора xml с помощью simplexml

$xml=simplexml_load_file("test.xml"); 
    print_r($xml); 

выводит следующее:

SimpleXMLElement Object ([@attributes] => Array ([requestType] => schema)) 

Вот файл XML так, может быть, кто-то может увидеть, если есть ошибка или что-то в выводе:

<b1Reply:response requestType="schema"> 
    <b1Reply:uri>/query/AccountBalance.aspx?CustCardCodeFrom=C1007&CustCardCodeTo=C1007</b1Reply:uri> 
    <b1Reply:status>OK</b1Reply:status> 
    <b1Reply:payload schemaDigest="ECDF0140846BF818A8A0605CB609BB7E"> 
    <querydata queryName="/query//AccountBalance.aspx?CustCardCodeFrom=C1007&CustCardCodeTo=C1007"> 
    <columns> 
    <column name="ID" alias="ID" type="Int64" key="false"/> 
    <column name="CompanyName" alias="CompanyName" type="String" key="false"/> 
    <column name="CompanyAddr" alias="CompanyAddr" type="String" key="false"/> 
    <column name="Phone" alias="Phone" type="String" key="false"/> 
    <column name="Fax" alias="Fax" type="String" key="false"/> 
    <column name="CompanyCurrency" alias="CompanyCurrency" type="String" key="false"/> 
    <column name="_CustStatmentHdr_CardCode" alias="CardCode" type="String" key="false"/> 
    <column name="_CustStatmentHdr_CardName" alias="CardName" type="String" key="false"/> <column name="_CustStatmentHdr_CardType" alias="CardType" type="String" key="false"/> 
<column name="_CustStatmentHdr_Balance" alias="Balance" type="Decimal" key="false"/> 
<column name="_CustStatmentHdr_BalanceFC" alias="BalanceFC" type="Decimal" key="false"/> 
<column name="_CustStatmentHdr_BalanceSys" alias="BalanceSys" type="Decimal" key="false"/> 
<column name="_CustStatmentHdr_Currency" alias="Currency" type="String" key="false"/> 
<column name="_CustStatmentHdr_PymntGroup" alias="PymntGroup" type="String" key="false"/> 
<column name="_CustStatmentHdr_GroupName" alias="GroupName" type="String" key="false"/> 
<column name="_CustStatmentHdr_SlpName" alias="SlpName" type="String" key="false"/> 
<column name="_CustStatmentDtl_TransId" alias="TransId" type="Int32" key="false"/> 
<column name="_CustStatmentDtl_TransType" alias="TransType" type="Int32" key="false"/> 
<column name="_CustStatmentDtl_DtlCardCode" alias="DtlCardCode" type="String" key="false"/> 
<column name="_CustStatmentDtl_RefDate" alias="RefDate" type="DateTime" key="false"/> 
<column name="_CustStatmentDtl_TaxDate" alias="TaxDate" type="DateTime" key="false"/> 
<column name="_CustStatmentDtl_DueDate" alias="DueDate" type="DateTime" key="false"/> 
<column name="_CustStatmentDtl_Ref1" alias="Ref1" type="String" key="false"/> 
<column name="_CustStatmentDtl_Amount" alias="Amount" type="Decimal" key="false"/> 
<column name="_CustStatmentDtl_SYSCred" alias="SYSCred" type="Decimal" key="false"/> 
<column name="_CustStatmentDtl_SYSDeb" alias="SYSDeb" type="Decimal" key="false"/> 
<column name="_CustStatmentDtl_SourceLine" alias="SourceLine" type="Int16" key="false"/> 
<column name="_CustStatmentDtl_Document_ID" alias="Document ID" type="String" key="false"/> 
<column name="_CustStatmentDtl_Customer_PO_No." alias="Customer PO No." type="String" key="false"/> 
<column name="_CustStatmentDtl_Source_Document_ID" alias="Source Document ID" type="Int32" key="false"/> 
<column name="_CustStatmentDtl_TranType" alias="TranType" type="String" key="false"/> 
<column name="_CustStatmentDtl_DocAmount" alias="DocAmount" type="Decimal" key="false"/> 
<column name="_CustStatmentDtl_JournalLine" alias="JournalLine" type="Int16" key="false"/> 
</columns> 
<data> 
<row id="1"> 
<ID>2</ID> 
<CompanyName/> 
<CompanyAddr>address</CompanyAddr> 
<Phone>555-555-5555</Phone> 
<Fax>555-555-5555</Fax> 
<CompanyCurrency>$</CompanyCurrency> 
<_CustStatmentHdr_CardCode>C1007</_CustStatmentHdr_CardCode> 
<_CustStatmentHdr_CardName>Card Name</_CustStatmentHdr_CardName> 
<_CustStatmentHdr_CardType>C</_CustStatmentHdr_CardType> 
<_CustStatmentHdr_Balance>168069.405000</_CustStatmentHdr_Balance> 
<_CustStatmentHdr_BalanceFC>0.000000</_CustStatmentHdr_BalanceFC> 
<_CustStatmentHdr_BalanceSys>168069.405000</_CustStatmentHdr_BalanceSys> 
<_CustStatmentHdr_Currency>$</_CustStatmentHdr_Currency> 
<_CustStatmentHdr_PymntGroup>NET 7 DAYS</_CustStatmentHdr_PymntGroup> 
<_CustStatmentHdr_GroupName>Food Distribution</_CustStatmentHdr_GroupName> 
<_CustStatmentHdr_SlpName>John Doe</_CustStatmentHdr_SlpName> 
<_CustStatmentDtl_TransId>5036</_CustStatmentDtl_TransId> 
<_CustStatmentDtl_TransType>13</_CustStatmentDtl_TransType> 
<_CustStatmentDtl_DtlCardCode>C1007</_CustStatmentDtl_DtlCardCode> 
<_CustStatmentDtl_RefDate>7/5/2013 12:00:00 AM</_CustStatmentDtl_RefDate> 
<_CustStatmentDtl_TaxDate>7/5/2013 12:00:00 AM</_CustStatmentDtl_TaxDate> 
<_CustStatmentDtl_DueDate>7/12/2013 12:00:00 AM</_CustStatmentDtl_DueDate> 
<_CustStatmentDtl_Ref1>106346</_CustStatmentDtl_Ref1> 
<_CustStatmentDtl_Amount>27709.610000</_CustStatmentDtl_Amount> 
<_CustStatmentDtl_SYSCred>0.000000</_CustStatmentDtl_SYSCred> 
<_CustStatmentDtl_SYSDeb>27709.610000</_CustStatmentDtl_SYSDeb> 
<_CustStatmentDtl_SourceLine>1</_CustStatmentDtl_SourceLine> 
<_CustStatmentDtl_Document_ID>106346</_CustStatmentDtl_Document_ID> 
<_CustStatmentDtl_Customer_PO_No.>469</_CustStatmentDtl_Customer_PO_No.> 
<_CustStatmentDtl_Source_Document_ID>1347</_CustStatmentDtl_Source_Document_ID> 
<_CustStatmentDtl_TranType>Invoice</_CustStatmentDtl_TranType> 
<_CustStatmentDtl_DocAmount>27709.610000</_CustStatmentDtl_DocAmount> 
<_CustStatmentDtl_JournalLine>0</_CustStatmentDtl_JournalLine> 
</row> 
</data> 
</querydata> 
</b1Reply:payload> 
<b1Reply:error/> 
</b1Reply:response> 

Если я попытаюсь повторить один атрибут, он будет пустым. Я в недоумении, и нуб в симплекс. Любая помощь приветствуется.

+0

Похож разбором отлично работает в том, что у вас есть объект SimpleXMLElement вернулся. У вас проблемы с получением какого-либо атрибута? Можете ли вы показать, что вы пытаетесь сделать, чтобы получить значение этого атрибута? Я бы предположил, что вы больше всего заботитесь об узле 'data' правильно? –

+0

Да, мне нужно иметь возможность возвращать определенные значения из xml на основе каждого клиента. Я перехожу к руководству simplexml и ничего не возвращает данные. Вот пример, который я извлек из руководства и попробовал: '$ xmlStr = file_get_contents ('test.xml'); \t $ xml = new SimpleXMLElement ($ xmlStr); \t $ result = $ xml-> xpath ("data/Phone"); while (list (, $ node) = each ($ result)) { данные echo '/ Телефон:', $ node, "\ n"; } ' – RiotAct

ответ

0

Во-первых, ваш XML не является действительным, см http://www.xmlvalidation.com

Чтобы выбрать атрибуты узла, используйте xpath, здесь определенный атрибут из конкретного узла:

$xml = simplexml_load_string($x); // assume XML in $x 
$result = (string)$xml->xpath("//column[@name = '_CustStatmentHdr_Currency']/@alias")[0]; 
echo $result; 

Выход:

Currency 

Комментарии:

(1) код занимает PHP> = 5.4 для массива разыменования [0] в строке 2
(2) приведение к (строки), в противном случае вы получите Simplexml-Object назад

Чтобы получить все узлы столбцов с все атрибуты, сделать:

$results = $xml->xpath("//column"); 
foreach ($results as $result) { 
    foreach ($result->attributes() as $name, $value) 
     echo "$name: $value, "; 
    echo PHP_EOL; 
}  

видеть, что это работает: https://eval.in/40273

Смежные вопросы