SimpleXML: как получить значение узла с условием на правило разбора?
У меня есть файл XML, который был сгенерирован внешней сущностью, которую я хочу проанализировать с помощью SimpleXML. Моя проблема в том, что в отображении, заданном клиентом, у меня есть некоторые условия для получения информации, которую я хочу.
Например, отображение для клиентского кода выглядит примерно так: E1ADRM1\PARTNER_Q=OSO\E1ADRE1\EXTEND_D
что означает, что код для клиента является значением EXTEND_D
тег, который вложен в один из множества PARTNER_Q
теги. Тот, который имеет OSO
значение.
Сегодня я начинаю изучать SimpleXML, поэтому понятия не имею, как получить эту информацию.
Из того, что я читал до сих пор, довольно просто получить информацию об узле и получить доступ к его свойствам. Если я один PARTNER_Q и никаких условий, мой $clientCode
было бы $xml->E1ADRM1->PARTNER_Q->E1ADRE1->EXTEND_D
(право?)
Любой намек на то, как я могу получить информацию с этим PARTNER_Q=OSO
состояние в виду?
Заранее спасибо.
1 ответ
Для дальнейшего использования я оставлю здесь код с тем, как я это решил. Я основал свой код на этом хорошо написанном ответе, который я нашел.
$root = $xml->IDOC;
$shippingPoints = array();
// Go through the list of OTs
foreach($root->E1EDL20 as $ot) {
// Instanciate empty OT
$otInfo = emptyOt();
$otInfo["refOt"] = trim($ot->VBELN);
// Go through partner to get the wanted items
foreach ($ot->E1ADRM1 as $partner) {
switch ($partner->PARTNER_Q) {
case "OSO":
$otInfo["codeLoader1"] = trim($partner->E1ADRE1->EXTEND_D);
break;
case "OSP":
$otInfo["refShip"] = trim($partner->PARTNER_ID);
// get the shipping info if not already fetched
if(!isset($shippingPoints[$otInfo["refShip"]])) {
$shippingPoints[$otInfo["refShip"]] = Whouses::getWhouseAddressByCode($otInfo["refShip"]);
}
// assign values
$otInfo["brandNameShip"] = $shippingPoints[$otInfo["refShip"]]["name"];
$otInfo["addrShip1"] = $shippingPoints[$otInfo["refShip"]]["address"];
$otInfo["cityShip"] = $shippingPoints[$otInfo["refShip"]]["city"];
$otInfo["zipShip"] = $shippingPoints[$otInfo["refShip"]]["zipcode"];
$otInfo["countryShip"] = $shippingPoints[$otInfo["refShip"]]["country"];
break;
case "WE":
$otInfo["refDeliv"] = trim($partner->PARTNER_ID);
$otInfo["addrDeliv1"] = trim($partner->STREET1);
$otInfo["cityDeliv"] = trim($partner->CITY1);
$otInfo["zipDeliv"] = trim($partner->POSTL_COD1);
$otInfo["countryDeliv"] = trim($partner->COUNTRY1);
default:
// do nothing
break;
}
}
// Go through the dates info to get the wanted items
foreach ($ot->E1EDT13 as $qualf) {
switch ($qualf->QUALF) {
case "006":
$dtDeliv = trim($qualf->NTANF);
$timeDeliv = trim($qualf->NTANZ);
$otInfo["initialDtDeliv"] = convertToOtDateFormat($dtDeliv, $timeDeliv);
break;
case "007":
$initialDtShip = trim($qualf->NTANF);
$timeInitialDtShip = trim($qualf->NTANZ);
$otInfo["initialDtShip"] = convertToOtDateFormat($initialDtShip, $timeInitialDtShip);
break;
default:
// do nothing
break;
}
}
}
Надеюсь, это кому-нибудь поможет!