SimpleXML:如何使用 xpath 查询解析节点名,包括点
SimpleXML: How to parse nodenames including dots with xpath query
我必须解析以下 XML:
<BMECAT version="2005" xmlns="http://www.bmecat.org/bmecat/2005fd">
<T_NEW_CATALOG prev_version="0">
<PRODUCT>
<NAME>Test</NAME>
<USER_DEFINED_EXTENSIONS>
<UDX.VENDOR.ATTRIBUTE lang="de">German</UDX.VENDOR.ATTRIBUTE>
<UDX.VENDOR.ATTRIBUTE lang="en">English</UDX.VENDOR.ATTRIBUTE>
</USER_DEFINED_EXTENSIONS>
</PRODUCT>
</T_NEW_CATALOG>
</BMECAT>
我需要通过 xpath 获取值 "German"。到目前为止我尝试过的一切都没有用,所以我需要一些帮助。我认为问题在于标记名包含点。我找不到逃避 xpath 表达式的方法。
您显示的XML格式不正确(USER_DEFINED_EXTENSIONS
未正确关闭),无法解析。假设输入格式正确,您可以使用 DOMDocument 而不是 SimpleXML:
<?php
$xml = <<<'XML'
<BMECAT version="2005" xmlns="http://www.bmecat.org/bmecat/2005fd">
<T_NEW_CATALOG prev_version="0">
<PRODUCT>
<NAME>Test</NAME>
<USER_DEFINED_EXTENSIONS>
<UDX.VENDOR.ATTRIBUTE lang="de">German</UDX.VENDOR.ATTRIBUTE>
<UDX.VENDOR.ATTRIBUTE lang="en">English</UDX.VENDOR.ATTRIBUTE>
</USER_DEFINED_EXTENSIONS>
</PRODUCT>
</T_NEW_CATALOG>
</BMECAT>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$xpath->registerNamespace("bme",
"http://www.bmecat.org/bmecat/2005fd");
$expression = 'string(
/bme:BMECAT
/bme:T_NEW_CATALOG
/bme:PRODUCT
/bme:USER_DEFINED_EXTENSIONS
/bme:UDX.VENDOR.ATTRIBUTE[@lang = "de"]
)';
var_dump($xpath->evaluate($expression));
结果会是
German
如果您需要使用 SimpleXML,您确实需要显示您当前的 PHP 代码。
我必须解析以下 XML:
<BMECAT version="2005" xmlns="http://www.bmecat.org/bmecat/2005fd">
<T_NEW_CATALOG prev_version="0">
<PRODUCT>
<NAME>Test</NAME>
<USER_DEFINED_EXTENSIONS>
<UDX.VENDOR.ATTRIBUTE lang="de">German</UDX.VENDOR.ATTRIBUTE>
<UDX.VENDOR.ATTRIBUTE lang="en">English</UDX.VENDOR.ATTRIBUTE>
</USER_DEFINED_EXTENSIONS>
</PRODUCT>
</T_NEW_CATALOG>
</BMECAT>
我需要通过 xpath 获取值 "German"。到目前为止我尝试过的一切都没有用,所以我需要一些帮助。我认为问题在于标记名包含点。我找不到逃避 xpath 表达式的方法。
您显示的XML格式不正确(USER_DEFINED_EXTENSIONS
未正确关闭),无法解析。假设输入格式正确,您可以使用 DOMDocument 而不是 SimpleXML:
<?php
$xml = <<<'XML'
<BMECAT version="2005" xmlns="http://www.bmecat.org/bmecat/2005fd">
<T_NEW_CATALOG prev_version="0">
<PRODUCT>
<NAME>Test</NAME>
<USER_DEFINED_EXTENSIONS>
<UDX.VENDOR.ATTRIBUTE lang="de">German</UDX.VENDOR.ATTRIBUTE>
<UDX.VENDOR.ATTRIBUTE lang="en">English</UDX.VENDOR.ATTRIBUTE>
</USER_DEFINED_EXTENSIONS>
</PRODUCT>
</T_NEW_CATALOG>
</BMECAT>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$xpath->registerNamespace("bme",
"http://www.bmecat.org/bmecat/2005fd");
$expression = 'string(
/bme:BMECAT
/bme:T_NEW_CATALOG
/bme:PRODUCT
/bme:USER_DEFINED_EXTENSIONS
/bme:UDX.VENDOR.ATTRIBUTE[@lang = "de"]
)';
var_dump($xpath->evaluate($expression));
结果会是
German
如果您需要使用 SimpleXML,您确实需要显示您当前的 PHP 代码。