我有以下类型的XML结构:
<catalog xmlns="http://www.namespace.com">
<product product-id="test-product">
<page-attributes>
<page-title xml:lang="en">test</page-title>
<page-title xml:lang="de">test2</page-title>
</page-attributes>
</product>
</catalog>
我使用以下内容来获取产品及其page-title
元素:
$xml->registerXPathNamespace('ns', $xml->getNamespaces()[""]);
$xpath = '//ns:product[@product-id="test-product"]';
$product = $xml->xpath($xpath)[0];
foreach ($product->{'page-attributes'}->{'page-title'} as $title) {
var_dump($title);
var_dump($title->{"@attributes"});
var_dump($title->attributes());
}
但我得到:
object(SimpleXMLElement)#4 (0) {
}
object(SimpleXMLElement)#6 (0) {
}
object(SimpleXMLElement)#6 (0) {
}
object(SimpleXMLElement)#6 (0) {
}
object(SimpleXMLElement)#4 (0) {
}
object(SimpleXMLElement)#4 (0) {
}
如何获取page-title
元素(test
,test2
)的值?另外我如何获得属性?属性在它们前面有xml:
。这是否意味着属性只在他们自己的命名空间中?
答案 0 :(得分:2)
您的代码有两个问题:
正如@MichaelBerkowski所提到的,如果您尝试检索它的值,则需要将SimpleXMLElement
转换为string
。
如果您尝试检索xml:
属性的值,则需要指定名称空间lang
。
您的代码应如下所示:
$xml->registerXPathNamespace('ns', $xml->getNamespaces()[""]);
$xpath = '//ns:product[@product-id="test-product"]';
$product = $xml->xpath($xpath)[0];
foreach ($product->{'page-attributes'}->{'page-title'} as $title) {
var_dump((string) $title);
var_dump((string) $title->attributes('xml', TRUE)['lang']);
}
输出:
string(4) "test"
string(2) "en"
string(5) "test2"
string(2) "de"
关于字符串转换。请注意,如果您尝试执行以下操作:
echo "Title: $title";
您不必显式转换为string
,因为SimpleXMLElement
支持__toString()
方法,PHP会自动将其转换为字符串 - 在这样的字符串上下文中
var_dump()
不能假设字符串上下文,因此它会输出&#34; real&#34;变量的类型:SimpleXMLElement
。