【问题标题】:Xpath problem, getting the id(attribute) of a element, if you know the title of the elementXpath 问题,获取元素的 id(attribute),如果你知道元素的标题
【发布时间】:2011-01-16 21:50:13
【问题描述】:

这是我的 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);

亲切的问候,

用户。

【问题讨论】:

  • 您的 for 循环似乎不完整:for($i = 0; $i title;
  • 这里没有 XML 文档——这意味着 xml 和 xpath 不是这个问题的合适标签。

标签: php xml dom simplexml


【解决方案1】:

只要使用 SimpleXml,就不能直接返回 ID。正确的 XPath 应该是

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

如其他地方所示。但是 SimpleXml 没有属性节点的概念。它只知道 SimpleXmlElements。因此,您也可以改为获取 Article 节点

/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)

如果您想搜索标题部分包含“crack”的文章,请使用

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

【讨论】:

  • 我尝试过使用 DOM,但它并没有真正起作用。 var_dump 给了我这个“string(0)”,这是否意味着有另一个节点具有相同的值?导致这不是真的。
  • @user no,表示ID属性为空字符串。我在上面添加了一个指向键盘的链接。在那里你可以看到一个完整的工作脚本,上面显示的代码是 sn-p。另请注意,XML 区分大小写,因此 id 不是 ID。
  • 啊哈哈我没有看到链接,我测试了它,它确实有效。我用 this->$dom->load('Articles.xml'); 替换了 $xml,但这不起作用。是否可以使用外部 XML 文档?
  • @user load 是正确的。我不确定你在那里尝试了什么。除非您将 DOMDocument 分配给属性,否则它只是 $dom->load() 而不是 $this->dom->load()
  • 是的,我试过 $dom->load('Articles.xml');不工作:(我不敢相信这是不可能的,只是返回标题为'x'的节点的属性值
【解决方案2】:

路径

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

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

【讨论】:

  • 我想你的意思是写 /Articles/Article[title="crack"]/@ID。但这是一个奇怪的问题 - 它要求一个 XPath 解决方案,但似乎并没有尝试在 XPath 中这样做,而是使用大量不必要的过程 PHP 代码。
  • 先生,这就是我问的原因。我要求提供 xpath 解决方案。我知道 PHP 代码是不必要的代码,但我就是不知道如何使用 xpath 来完成它。我想我需要更多地研究 xpath ;) 顺便说一句,你给的 xpath 并没有真正起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2013-08-03
  • 2011-03-06
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多