Xpath问题,获取元素的id(属性),如果你知道元素的标题

时间:2011-01-16 21:50:14

标签: php xml dom simplexml

这是我的XML文件,我想知道如何在知道时获取文章的ID 标题是什么。这可能是使用Xpath吗?

XML文件:

<Articles>
    <Article ID="1">
        <title>test</title>
        <content>test</content>
    </Article>
</Articles>

Php代码:

$dom = new DOMDocument;
$dom->load("Articles.xml");
$xp = new DOMXPath($dom);
$id = $xp->evaluate('string(/Articles/Article[title="test"]/@ID)');
var_dump($id);

亲切的问候,

用户。

2 个答案:

答案 0 :(得分:2)

只要您使用的是SimpleXml,就无法直接返回ID。正确的XPath将是

/Articles/Article[title="crack"]/@ID

如其他地方所示。但是SimpleXml没有Attribute节点的概念。它只知道SimpleXmlElements。所以你也可以改为获取文章节点

/Articles/Article[title="crack"]

因为最后您必须执行以下操作才能获得ID值:

echo $articles[0]['id'];

请注意,从SimpleXml元素访问属性时不需要@。

如果您想直接获取ID属性,则必须使用DOM(codepad

$dom = new DOMDocument;
$dom->loadXml($xml);
$xp = new DOMXPath($dom);
$id = $xp->evaluate('string(/Articles/Article[title="crack"]/@ID)');
var_dump($id);

只要没有其他节点的title元素值等于“crack”,上面就会返回1.

如果您的节点具有格式like shown in your screenshot,则必须在测试值之前清理该元素。否则,将考虑用于格式化文档的空格。 XPath就是

string(/Articles/Article[normalize-space(title) = "crack"]/@ID)

如果您要搜索标题包含“破解”的文章,请使用

string(/Articles/Article[contains(title, "crack")]/@ID)

请注意,只要只有一个结果,这仍然只会立即返回ID。如果存在多个匹配节点,则将返回第一个ID值。使用

/Articles/Article[contains(title, "crack")]/@ID

返回所有匹配节点的DOMNodeList,然后迭代它们以获取它们各自的ID值。

另见basic usage examples for SimpleXml in the PHP Manual

答案 1 :(得分:0)

路径

/Articles/Article[title = "crack"]/@ID

应该这样做。您不必遍历节点。