如何分析定义了多个命名空间的 SOAP xml 响应.我需要解析返回的文章数组



soap xml 响应是这样的:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS1="urn:TPAPIPosIntfU-ITPAPIPOS">
<NS1:GetArticlesInfoResponse xmlns:NS2="urn:TPAPIPosIntfU" xmlns:NS3="urn:TPAPIPosTypesU">
<return xsi:type="NS2:TGetArticlesInfoResponse">
<ReturnCode xsi:type="xsd:int">0</ReturnCode>
<ReturnMessage xsi:type="xsd:string">ok</ReturnMessage>
<Articles xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TArticleInfo[x]">...</Articles>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</return>
</NS1:GetArticlesInfoResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这是我需要解析的文章数组:

<item xsi:type="NS3:TArticleInfo">
<ArticleId xsi:type="xsd:long">5000001716</ArticleId>
<ArticleName xsi:type="xsd:string">Coca Cola</ArticleName>
<ArticleNumber xsi:type="xsd:int">1</ArticleNumber>
<Available xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:long[3]">
<item>5000000210</item>
<item>5000000208</item>
<item>5000000209</item>
</Available>
<DepartmentId xsi:type="xsd:long">5000000170</DepartmentId>
<Prices xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TItemPrice[2]">
<item xsi:type="NS3:TItemPrice">
<ArticleId xsi:type="xsd:long">5000001716</ArticleId>
<PriceId xsi:type="xsd:long">5000000206</PriceId>
<Amount xsi:type="xsd:double">2</Amount>
<Vat xsi:type="xsd:double">21</Vat>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>
<item xsi:type="NS3:TItemPrice">
<ArticleId xsi:type="xsd:long">5000001716</ArticleId>
<PriceId xsi:type="xsd:long">5000000207</PriceId>
<Amount xsi:type="xsd:double">1.7</Amount>
<Vat xsi:type="xsd:double">12</Vat>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>
</Prices>
<FreeOption xsi:type="xsd:long">5000000145</FreeOption>
<Options xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:long[1]">
<item>5000000143</item>
</Options>
<IsMenu xsi:type="xsd:boolean">false</IsMenu>
<IsManualPrice xsi:type="xsd:boolean">false</IsManualPrice>
<IsActive xsi:type="xsd:boolean">true</IsActive>
<Promo xsi:type="xsd:boolean">false</Promo>
<HqId xsi:type="xsd:string">Coca Cola</HqId>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[5]">
<item xsi:type="NS3:TExtraInfo">
<Key xsi:type="xsd:string">daily_stock_active</Key>
<Value xsi:type="xsd:string">0</Value>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>
<item xsi:type="NS3:TExtraInfo">
<Key xsi:type="xsd:string">daily_stock_qty</Key>
<Value xsi:type="xsd:string">0</Value>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>
<item xsi:type="NS3:TExtraInfo">
<Key xsi:type="xsd:string">purchase_price</Key>
<Value xsi:type="xsd:string">0.0000</Value>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>
<item xsi:type="NS3:TExtraInfo">
<Key xsi:type="xsd:string">course_id</Key>
<Value xsi:type="xsd:string">5000001331</Value>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>
<item xsi:type="NS3:TExtraInfo">
<Key xsi:type="xsd:string">info</Key>
<Value xsi:type="xsd:string"/>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>
</Extra>
</item>
Parameter   Type    Description
ArticleId   Long    Internal Id of this Article
ArticleName String  Name of this Article
ArticleNumber   Integer Number of this Article
Available   [Long]  List of Sales Area Id's where this Article is available
Prices  [ItemPrice] List of Prices for this Article
DepartmentId    Long    Id of the Department where this Article belongs to
FreeOption  Long    Free Option ID
Options [Long]  List of must-have options
IsMenu  Boolean Returns true if this Article is a menu
IsManualPrice   Boolean Returns true if this Article requires a manual price input when ordered
IsActive    Boolean Returns if true is this Article is active
Promo   Boolean Return true if this Article is a Cobmo/Promo article
HqId    String  HQ Id
Extra   [ExtraInfo] List of extra fields
List of available extra fields:
Key Description
course_id   Only return articles of a specific course
daily_stock_active  1/0 (if DailyStock=1 was specified in request’s Extra fields)
daily_stock_qty Daily stock quantity (if DailyStock=1 was specified in request’s Extra fields)
info    Article info (tab 9 of the article settings in back-office)
plu When PLU is not zero
purchase_price  Purchase price
ArticleShort
ArticleShort Object
<item xsi:type="NS3:TArticleShort">
<ArticleId xsi:type="xsd:long">5000001716</ArticleId>
<ArticleName xsi:type="xsd:string">Coca Cola</ArticleName>
<ArticleNumber xsi:type="xsd:int">1</ArticleNumber>
<SalesAreaId xsi:type="xsd:long">5000000210</SalesAreaId>
<DepartmentId xsi:type="xsd:long">5000000170</DepartmentId>
<HqId xsi:type="xsd:string">Coca Cola</HqId>
<Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>

如何在 php curl 中解析此 soap XML 响应以获取文章数组数据?我已经尝试过SimpleXMLElement,但我无法解析它。

我已经冲浪了很多寻找答案,但无法获得正确的解析技术。如果是,我应该使用 Xpath 吗,那么如何创建一个 XPath 来解析文章数组?

使用 XPath和 SimpleXML 的简单解决方案,从 XML 的外观来看,它们不涉及 XPath 本身的命名空间。 这将加载 XML,然后查找名为<return>的元素,该元素具有名为<Articles>的直接后代。 当xpath()返回节点列表时,它只选择第一个(使用[0])并迭代包含的<item>元素并输出<ArticleId>元素值。

$xml = simplexml_load_string($data);
$articles = $xml->xpath("//return/Articles");
foreach ( $articles[0]->item as $item )    {
echo (string)$item->ArticleId.PHP_EOL;
}

有了测试数据,这给了...

5000001716
5000001716

最新更新