2015-11-20 3 views
4

Я получаю это 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 объектов, как в примере). Теперь мне нужно написать какой-то картограф для этого имени.

+4

Почему полевые теги закрыто с/полюсом? Будет неплохо проверить, успешно ли вы загрузили XML> http://php.net/manual/en/simplexml.examples-errors.php – Svetoslav

ответ

1
  1. После коррекции закрытия XML-тег как Бартош ответил, вы можете попробовать XPATH синтаксис //field[@object="Name"], если вам не нужно, что атрибут «объект» является первым один. Но я не пробовал это с php.
  2. В .NET-приложении я использую это без регистрации пространства имен и работает.
+0

. Ваше решение сказочно. Но я написал в EDIT2 - он слишком много ломает из-за этих родовых имен ... Но ваше решение поможет мне подготовить другое решение. –

0

Я думаю, что ваш XML должен идти, как это, с ним я мог разобрать его с PHP XPath

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="nameOwn.xsl"?> 
<sawpe xmlns:bla="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> 

Изменено xmlns="adress" к xmlns:bla="adress" И поле элемент был закрыт с pole

Смежные вопросы