我收到上面的XML:
2014-09-09 15:12:47
name.xml
email@email.com
Name Surname
PL
Name
Surname
SERIALNUMBER:32106901960
我写:
$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")]');
}
但我总是收到虚假的.正如你所看到的 – 我试图使用starts-with和contains但它不起作用.你能帮我吗 ?
第二个问题 – 可以使用没有注册命名空间的Xpath并使用如下的查询:’// x:field'(在xml中我只是< field(...)>)
编辑:我更正了XML – 我在这里添加了错误的结束标记.这个xml只是准备好的例子,它不是我收到的真正的XML(一切都在抛光). $entry store SimpleXMLElement.
EDIT2:我检查了这个XML的模式 – 我发现字段和对象不是独占的 – 它可以存储许多节点.这是某种通用名称.
我改变了我的解决方案,我写了这个:
foreach($domInternal->raport->signature->field as $field){
$attribute = (string)$field->attributes();
$value = (string)$field[0];
}
现在我只有来自签名的字段而且我得到了所有属性(不仅仅是这个例子中的6个对象).现在我必须为这些名称写一些mapper.
解决方法:
>在像Bartosz回答的那样纠正关闭的xml标签后,你可以尝试使用xpath语法// field [@ object =“Name”],如果你不需要属性“object”是第一个.但我没有尝试用PHP.
>在.NET应用程序中,我使用它而没有命名空间注册,它可以工作.
标签:php,parsing,xml,xpath
来源: https://codeday.me/bug/20190706/1397925.html