Вывести известные атрибуты из XML в PHP с помощью SimpleXMLElement - PullRequest
0 голосов
/ 10 февраля 2019

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

<RegItems>
   <RegItem Name="Test Regger" Email="me@here.com" 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 = "test@here.com" />
      <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:        me@here.com
   Organistion:  XXX

Я получаю:

   Name:         
   Email:        
   Organistion:  

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

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

$regName = $xml->xpath("//RegItem")[0]['Name'];
0 голосов
/ 10 февраля 2019

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

  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')
...