我有一个文件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>
答案 0 :(得分:1)
XML命名空间也是一种识别元素/属性所属格式的方法。
s:
是一个名称空间别名,在本例中是由根元素上的xmlns:s属性定义的名称空间http://schemas.xmlsoap.org/soap/envelope/
。因此s:Envelope
和s: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)