Я получаю это XML, как и выше:Синтаксический XML с помощью Xpath атрибутами
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="nameOwn.xsl"?>
<sawpe xmlns="adress" xmlns:xsi="secondadress">
<raport>
<dataTS>2014-09-09 15:12:47</dataTS>
<files>
<file>name.xml</file>
</files>
<signature>
<field object="E-mail (EMAILADDRESS)">[email protected]</field>
<field object="Subject (CN)">Name Surname</field>
<field object="Country (C)">PL</field>
<field object="Name (GIVENNAME)">Name</field>
<field object="Surname (SURNAME)">Surname</field>
<field object="Number (SERIALNUMBER)">SERIALNUMBER:32106901960</field>
</signature>
</raport>
</sawpe>
Я писал:
$domInternal = new SimpleXMLElement($this->xml, LIBXML_COMPACT);
$namespaces = $domInternal->getNamespaces(true);
$domInternal->registerXPathNamespace('x',$namespaces['']);
$informationAboutSignature = $domInternal->xpath('//x:raport/x:signature');
foreach($informationAboutSignature as $entry){
$person['name'] = $entry->xpath('//x:field[contains(@object, "Name")]');
$person['surname'] = $entry->xpath('//x:field[contains(@object, "Surname")]');
$person['serialNumber'] = $entry->xpath('//x:field[starts-with(@object, "Number")]');
$person['country'] = $entry->xpath('//x:field[starts-with(@object, "Country")]');
$person['contact'] = $entry->xpath('//x:field[starts-with(@object, "E-mail")]');
}
Но я всегда получаю ложь. Как вы можете видеть - я пытался использовать start-with и содержит, но это не работает. Вы можете помочь ?
Второй вопрос - его можно использовать Xpath без регистрации имен и используя запрос типа: «// х: поле» (в XML у меня есть только <field (...)>
)
EDIT: Я исправил XML - я ставлю неправильные теги закрытия Вот. Этот xml только что подготовлен, это не настоящий XML, который я получаю (все в полировке). $ entry store SimpleXMLElement.
EDIT2: Я проверил схему этого XML - И я узнал, что поле и объект не являются исключительными - он может хранить много узлов. Это своего рода родовое имя.
я изменил свое решение и Я wroten это:
foreach($domInternal->raport->signature->field as $field){
$attribute = (string)$field->attributes();
$value = (string)$field[0];
}
Теперь у меня есть только поле с подписью и я каждые атрибуты (не только эти 6 объектов, как в примере). Теперь мне нужно написать какой-то картограф для этого имени.
Почему полевые теги закрыто с/полюсом? Будет неплохо проверить, успешно ли вы загрузили XML> http://php.net/manual/en/simplexml.examples-errors.php – Svetoslav