【问题标题】:Check if Child node exists and get parent node in xml检查子节点是否存在并在xml中获取父节点
【发布时间】:2016-02-04 23:30:27
【问题描述】:

我已经加载了一个 xml 文件,并且当子节点存在时我想要一个特定的节点。

例如:如果supplierItem->supplier->id 是“0101”,我想从这个特定的supplierItem 中获取库存“1”。所以我需要特定供应商id的父库存节点。

我的 xml 看起来像这样

<product>
     <supplierItem>
        <id>0001</id>
        <supplier>
           <id>0101</id>
           <name>Company_1</name>
        </supplier>
        <supplierItemId>Product_1_ID</supplierItemId>
        <productName>Product_1</productName>
        <stock>1</stock>
     </supplierItem>
        <id>0002</id>
        <supplier>
           <id>0202</id>
           <name>Company_2</name>
        </supplier>
        <supplierItemId>Product_1_ID</supplierItemId>
        <productName>Product_1</productName>
        <stock>2</stock>
     </supplierItem>
        <id>0003</id>
        <supplier>
           <id>0303</id>
           <name>Company_3</name>
        </supplier>
        <supplierItemId>Product_1_ID</supplierItemId>
        <productName>Product_1</productName>
        <stock>3</stock>
     </supplierItem>
 </product>

我的第一次尝试是:

 $stocks = $xml->xpath("/product/supplierItem");
    foreach ($stocks as $stock)
    {
         echo($stock);   // get all stocks
    }

有什么想法吗?我坚持了下来... 提前致谢

【问题讨论】:

    标签: php xml nodes


    【解决方案1】:

    您需要阅读有关 Xpath 的信息。它可以轻松地做到这一点并且更多:

    获取supplierItem 个节点...

    /product/supplierItem

    ...带有子节点id...

    /product/supplierItem[id]

    ...等于“0101”...

    /product/supplierItem[id = "0101"]

    ... 并从中获取 stock 元素节点:

    /product/supplierItem[id = "0101"]/stock

    SimpleXMLElement::xpath() 只能返回节点数组,但 Xpath 本身甚至允许直接获取值。在 PHP 中,DOMXpath::evaluate() 是可能的:

    $stock = $domXpath->evaluate('string(/product/supplierItem[id = "0101"]/stock)')
    

    【讨论】:

    • 不错的答案,包括SimpleXML 代码:$stock = $xml-&gt;xpath("/product/supplierItem[id = '0101']/stock")[0];
    • 如果没有找到节点(并且数组为空),直接访问节点会导致 PHP 错误消息。对于稳定的源代码,您需要在访问它之前验证您是否拥有一个节点。就像使用 foreach() 一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多