XML读取值s:信封s:body

时间:2013-12-11 10:04:17

标签: php xml soap

我有一个文件XML,但是我有两个第一行奇怪,“< s:”, 我想在php中读取“< OrderList>”中的xml数据。 我搜索谷歌和其他关于肥皂,但没有任何作用。我试过,simplexml_load_file()和新的DomDocument()来解析数据... snif。

感谢您的帮助。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <GetOrderListResponse xmlns="http://www.cdiscount.com">
         <GetOrderListResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <ErrorMessage i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/Cdiscount.Framework.Core.Communication.Messages"/>
            <OperationSuccess xmlns="http://schemas.datacontract.org/2004/07/Cdiscount.Framework.Core.Communication.Messages">true</OperationSuccess>
            <ErrorList/>
            <SellerLogin>login</SellerLogin>
            <TokenId>???</TokenId>
            <OrderList>
               <Order>
                  <ArchiveParcelList>false</ArchiveParcelList>
                  <InitialTotalAmount>3.7</InitialTotalAmount>
                  <OrderLineList>
                     <OrderLine>
                        <AcceptationState>RefusedBySeller</AcceptationState>
                        <CategoryCode>06010701</CategoryCode>
                        <ProductEan>0123456789123</ProductEan>
                        <ProductId>3275054001106</ProductId>
                        <PurchasePrice>1.2</PurchasePrice>
                        <Quantity>1</Quantity>
                        <SellerProductId>REF3275054001</SellerProductId>
                        <Sku>3275054001106</Sku>
                        <SkuParent i:nil="true"/>
                        <UnitShippingCharges>2.5</UnitShippingCharges>
                     </OrderLine>
                  </OrderLineList>
               </Order>
            </OrderList>
         </GetOrderListResult>
      </GetOrderListResponse>
   </s:Body>
</s:Envelope>

1 个答案:

答案 0 :(得分:1)

XML命名空间也是一种识别元素/属性所属格式的方法。

s:是一个名称空间别名,在本例中是由根元素上的xmlns:s属性定义的名称空间http://schemas.xmlsoap.org/soap/envelope/。因此s:Envelopes:Body位于soap名称空间中。

GetOrderListResponse也有xmlns属性。这会将没有前缀的元素的名称空间更改为http://www.cdiscount.com

这是Soap,所以使用Soap extension类是个好主意。

如果您想使用DOM并直接查询数据,则必须考虑名称空间。

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
// register OWN namespace aliases for the xpath
$xpath->registerNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
$xpath->registerNamespace('cd', 'http://www.cdiscount.com');

// get all order nodes in "http://www.cdiscount.com" namespace
foreach ($xpath->evaluate('//cd:Order', NULL, FALSE) as $order) {
  // fetch the InitialTotalAmount as a number
  var_dump($xpath->evaluate('number(cd:InitialTotalAmount)', $order, FALSE));
}

输出:

float(3.7)