Учитывая следующий 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:
У вас есть пара проблем с вашим кодом. Во-первых, xpath
возвращает массив элементов, поэтому для доступа к отдельному значению вам нужно указать индекс массива. В вашем случае, так как есть только один RegItem
Вы можете просто использовать [0]
, Во-вторых, RegItem
не является элементом верхнего уровня в XML, поэтому XPath /RegItem
не будет ничего соответствовать Вы должны изменить это либо /RegItems/RegItem
или же //RegItem
(последний находит RegItem
на любой глубине). Так, например, чтобы получить Name
атрибут RegItem
вам нужно это:
$regName = $xml->xpath("//RegItem")[0]['Name'];
У вас есть несколько вопросов:
/RegItem
, Первый сингл / означает начало с корня документа. Корень это RegItems
элемент. Вы можете изменить его на /RegItems/RegItem
или //RegItem
(Двойная косая черта означает найти этот элемент в любом месте дерева XML.->item(0)
например, $xml->xpath("/RegItems/RegItem")->item(0)
getAttribute()
например, $xml->xpath("/RegItems/RegItem")->item(0)->getAttribute('Name')