SimpleXML:如何使用xpath查询解析包含点的节点名称

时间:2015-01-26 09:50:11

标签: php xml xpath simplexml

我必须解析以下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>

我需要获得价值&#34;德国&#34;通过xpath。到目前为止我尝试过的所有东西都没有用,所以我需要一些帮助。我认为问题是标记名包含点。我发现无法逃避xpath表达式。

1 个答案:

答案 0 :(得分:1)

您显示的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代码。