通过PHP使用多个名称空间从XML获取值

时间:2018-01-31 14:09:01

标签: php xml

我试图从一个使用3个名称空间的XML文件中读取并努力从中读取值。

<?xml version ="1.0"?> 
<Invoice xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"

<cac:PartyName>
<cbc:Name>John Doe</cbc:Name>
</cac:PartyName>

我的PHP到目前为止已经阅读了几个例子,自从我写PHP以来已经好几年了,所以对你们来说这很容易。

<?php

$xml = simplexml_load_file('file.xml');
$xml->registerXPathNamespace('cbc', 
'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
$xml->registerXPathNamespace('cac', 
  'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-
 2');

foreach($xml->xpath('//cac:PartyName') as $PartyName)
{
print_r ($PartyName->xpath('//cbc:Name')); 

}

?>

我只注册了两个命名空间,因为它们是XML文件中唯一使用的命名空间。 (CBC和CAC)。我得到了整个阵列的结果,但我有点希望我的输出只是“John Doe”。

2 个答案:

答案 0 :(得分:1)

您可以通过将其转换为字符串来访问SimpleXMLElement的文本内容:

echo (string) $PartyName->xpath('//cbc:Name')[0];

注意在行尾添加的[0] - xpath方法返回一个对象数组,我们只需要引用第一个。

请参阅https://eval.in/945981

答案 1 :(得分:1)

取决于您拥有的其他数据以及文档中其他具有相同名称的元素可能取决于您的XPath的具体程度。

foreach($xml->xpath('//cac:PartyName') as $PartyName)
{
    echo (string)$PartyName->children('cbc', true)->Name.PHP_EOL;
}

以上意味着它将是<PartyName>元素下的所有数据,然后您可以选择所需的位。

foreach($xml->xpath('//cac:PartyName/cbc:Name') as $PartyName)
{
    echo (string)$PartyName.PHP_EOL;
}

这限制了它只是直接在PartyName元素下选择Name元素,以防Name元素可能存在于其他地方。