php – 使用Xpath按属性解析xml
发布时间:2020-12-13 15:59:14 所属栏目:PHP教程 来源:网络整理
导读:我收到上面的 XML: ?xml version="1.0" encoding="UTF-8"??xml-stylesheet type="text/xsl" href="nameOwn.xsl"?sawpe xmlns="adress" xmlns:xsi="secondadress"raport dataTS2014-09-09 15:12:47/dataTS files filename.xml/file /files signature field o
我收到上面的
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 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应用程序中,我使用它而没有命名空间注册,它可以工作.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |