使用Xpath按属性分析xml


Parsing xml using Xpath by attributes

我收到了上面这样的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")]');
}

但我总是收到假的。正如你所看到的,我尝试使用以和包含开头,但不起作用。你能帮忙吗?

第二个问题-可以在没有注册命名空间的情况下使用Xpath,并使用类似于"//x:field"的查询(在xml中,我只有<field (...)>

编辑:我更正了XML——我在这里放了不正确的结束标记。这个xml只是准备好的示例,它不是我收到的真正的xml(所有内容都经过了润色处理)$入口存储SimpleXMLElement。

第二版:我检查了这个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应用程序中,我在没有命名空间注册的情况下使用它,而且它很有效

我认为您的XML应该是这样的,有了它,我可以用PHP XPath 解析它

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="nameOwn.xsl"?>
<sawpe xmlns:bla="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>

xmlns="adress"更改为xmlns:bla="adress"场元素用pole 封闭