【发布时间】:2016-02-22 15:03:30
【问题描述】:
我收到了像上面这样的 XML:
<?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@email.com</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")]');
}
但我总是收到假消息。如您所见-我尝试使用starts-with和contains,但它不起作用。你能帮忙吗?
第二个问题 - 可以在没有注册命名空间的情况下使用 Xpath,并使用如下查询:'//x:field'(在 xml 中我只有 <field (...)>)
编辑:我更正了 XML - 我在这里放了不正确的结束标签。这个 xml 只是准备好的例子,它不是我收到的真正的 XML(一切都是波兰语)。 $entry 存储 SimpleXMLElement。
EDIT2:我检查了这个 XML 的架构 - 我发现字段和对象不是独占的 - 它可以存储许多节点。这是某种通用名称。
我改变了我的解决方案,我写了这个:
foreach($domInternal->raport->signature->field as $field){
$attribute = (string)$field->attributes();
$value = (string)$field[0];
}
现在我只有来自签名的字段,并且我得到了每个属性(不仅仅是示例中的这 6 个对象)。现在我必须为这些名称编写一些映射器。
【问题讨论】:
-
为什么字段标签用 /pole 结束?最好检查您是否已成功加载 XML > php.net/manual/en/simplexml.examples-errors.php