php - 通过属性使用 Xpath 解析 xml

标签 php xml parsing xpath

我收到了上面这样的 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 个对象,就像示例中那样)。现在我必须为这些名称编写一些映射器。

最佳答案

  1. 像 Bartosz 那样更正结束 xml 标记后,如果不需要属性“object”,则可以尝试 xpath 语法 //field[@object="Name"]第一个。但是我没有用 php 试过。
  2. 在 .NET 应用程序中,我在没有命名空间注册的情况下使用它并且它有效。

关于php - 通过属性使用 Xpath 解析 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33821373/

相关文章:

php - 有没有办法提高 mysqli->prepare 的执行速度?

python - 将列表显示为字符串

json - JSONException错误Grails

php - 打破大量数据以显示在多个页面或列表中而无需脚本

javascript - 尝试从文本框中获取数据并将其插入数据库

用c程序将xml文件转换为wbxml

python - 如何使用python转义xml属性中的特殊字符

.net - 如何将 UTF-8 编码为 UTF-16 的 xml 字符串转换为 UTF-16?

java - 是否可以同时使用 TextStyle.SHORT 和 TextStyle.FULL 解析当月的日期?

php - .htaccess 不工作 - CodeIgniter