Проверьте, существует ли дочерний узел, и получите родительский узел в xml

Я загрузил файл xml, и мне нужен определенный узел, когда существует дочерний узел.

Например: если supplierItem->supplier->id равен «0101», я хочу получить запас «1» из этого конкретного SupplierItem. Поэтому мне нужен узел родительского запаса конкретного идентификатора поставщика.

Мой 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
    }

Любая идея? Я застрял с этим... Спасибо заранее


person Nils    schedule 04.11.2015    source источник


Ответы (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)')
person ThW    schedule 04.11.2015
comment
хороший ответ, чтобы включить код SimpleXML: $stock = $xml->xpath("/product/supplierItem[id = '0101']/stock")[0]; - person michi; 05.11.2015
comment
Прямой доступ к узлу может привести к сообщению об ошибке PHP, если узел не найден (и массив пуст). Для стабильного исходного кода вам нужно будет подтвердить, что вы получили узел перед доступом к нему. Например, с помощью foreach(). - person ThW; 05.11.2015