php 怎么用xpth,php – 使用Xpath按属性解析xml

我收到上面的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值