xpath — печать известных атрибутов из XML в PHP с помощью SimpleXMLElement

Учитывая следующий XML:

<RegItems>
<RegItem Name="Test Regger" Email="[email protected]" OrgName="XXX">
<Establishment Est_Name="Test Org 1" Est_Addr="Test Org 1, 1 Acacia Ave, London, W12 8QT, UK" Est_ContactName="Test One" Est_ContactNum ="321321321" Est_EmailAdd = "[email protected]" />
<Screens>
<Timestamp time="Sun, 10 Feb 2019 00:05:24 GMT"/>
<Screen PDate="2019-01-19" EDate="2019-12-13" SModel="Xi75" Sno="750001"  PCModSno="PC106-0001" PORef="444"/>
</Screens>
<UID hash ="dea31a69b70be709fb079bf7d50b1821"/>
</RegItem>
</RegItems>

У меня есть следующий код PHP для извлечения всех данных, но я получаю пробелы, возвращаемые для каждого атрибута в отформатированном сообщении.

   $xml = new SimpleXMLElement($regXML);
var_dump ($xml);
$regName = $xml->xpath("/RegItem")['Name'];
$regEmail = $xml->xpath("/RegItem")['Email'];
$regOrgName = $xml->xpath("/RegItem")['OrgName'];
$regEstOrgName = $xml->xpath("/RegItem/Establishment")['Est_Name'];
$regEstOrgAddr = $xml->xpath("/RegItem/Establishment")['Est_Addr'];
$regEstOrgContact = $xml->xpath("/RegItem/Establishment")['Est_ContactName'];
$regEstOrgTel = $xml->xpath("/RegItem/Establishment")['Est_ContactNum'];
$regEstOrgEmail = $xml->xpath("/RegItem/Establishment")['Est_EmailAdd'];
$regTimeStamp = $xml->xpath("/RegItem/Timestamp")['time'];

$mesg = <<<EOF


=====================================================
Origin XML: $regXML
=====================================================
Registered By Details:

Name:         $regName
Email:        $regEmail
Organistion:  $regOrgName

Registered Organisation:

Name:           $regOrgName
Address:        $regEstOrgAddr
Contact Name:   $regEstOrgContact
Contact Tel:    $regEstOrgTel
Contact Email:  $regEstOrgEmail
Time:           $regTimeStamp
=====================================================
Screens:

EOF;

$screens = $xml->xpath("/RegItem/Screens/Screen");
foreach($screens as $screen)
{
$screenWarrStartDate = $screen['PDate'];
$screenWarrEndDate = $screen['EDate'];
$screenModel = $screen['SModel'];
$screenSerial = $screen['Sno'];
$screenPCSerial = $screen['PCModSno'];
$screenPORef = $screen['PORef'];

$mesg .= <<< EOF

Screen Model:      $screenModel
Screen Serial No:  $screenSerial
PC Mod Serial No:  $screenPCSerial
PO Ref:            $screenPORef
Warranty Start:    $screenWarrStartDate
Warranty End:      $screenWarrEndDate

EOF;

}

$mesg .= "=====================================================
";

return ( $mesg );

Например. вместо

   Name:         Test Regger
Email:        [email protected]
Organistion:  XXX

Я получил:

   Name:
Email:
Organistion:

0

Решение

У вас есть пара проблем с вашим кодом. Во-первых, xpath возвращает массив элементов, поэтому для доступа к отдельному значению вам нужно указать индекс массива. В вашем случае, так как есть только один RegItemВы можете просто использовать [0], Во-вторых, RegItem не является элементом верхнего уровня в XML, поэтому XPath /RegItem не будет ничего соответствовать Вы должны изменить это либо /RegItems/RegItem или же //RegItem (последний находит RegItem на любой глубине). Так, например, чтобы получить Name атрибут RegItem вам нужно это:

$regName = $xml->xpath("//RegItem")[0]['Name'];
2

Другие решения

У вас есть несколько вопросов:

  1. Ваше выражение Xpath неверно. У тебя есть /RegItem, Первый сингл / означает начало с корня документа. Корень это RegItems элемент. Вы можете изменить его на /RegItems/RegItem или //RegItem (Двойная косая черта означает найти этот элемент в любом месте дерева XML.
  2. Запрос Xpath возвращает список элементов. Если вы хотите получить доступ к первому элементу, вы можете использовать ->item(0)например, $xml->xpath("/RegItems/RegItem")->item(0)
  3. Чтобы получить доступ к свойству элемента, используйте getAttribute()например, $xml->xpath("/RegItems/RegItem")->item(0)->getAttribute('Name')
1

По вопросам рекламы [email protected]