Nokogiri XML XPath 不选择 OpenXML 关系文件中的节点

Posted

技术标签:

【中文标题】Nokogiri XML XPath 不选择 OpenXML 关系文件中的节点【英文标题】:Nokogiri XML XPath does not select nodes in OpenXML Relationships file 【发布时间】:2013-06-17 01:00:16 【问题描述】:

我正在尝试查询 OpenXML PresentationML 格式中包含的以下示例关系 XML 文件的节点。

<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Target="../notesSlides/notesSlide1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" Id="rId2"/>
    <Relationship Target="../slideLayouts/slideLayout2.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Id="rId1"/>
    <Relationship Target="../media/image00.jpg" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Id="rId3"/>
</Relationships>

我想要的是为 Id="rId3" 的关系节点选择属性@Target。无论我通过什么 XPath 选择器,生成的节点集都是空的。谁能帮忙解开这个谜团?

【问题讨论】:

你尝试过什么样的选择器?你说“不管我通过什么 XPath 选择器”,但显然你做的不对,所以向我们展示你的尝试,以便我们更正你的工作。 【参考方案1】:

这是一个非常简单的问题,但因为你没有展示你的作品,所以我很犹豫是否简单地给你一个答案。

相反,这里有一些基本的构建块,不是使用 XPath,它会起作用,而是使用 CSS,它会更具可读性:

at 方法在文档中搜索第一次出现的选择器。这使用 CSS 选择器来查找第一个 &lt;Relationship&gt; 节点:

at('Relationship')

在 CSS 中,您可以使用其 ID 轻松找到特定节点:

at('#rId3')

使用在 Internet 上可用的常规 CSS 规则,您可以将这些规则组合起来以找到您想要的节点。了解 html 以及 CSS 如何使用选择器访问节点非常重要,但是一旦您知道它会让生活变得更轻松。

【讨论】:

【参考方案2】:

谜团在于你忘记了命名空间:

doc.at('//Relationship[@Id="rId3"]')[:Target]

失败,因为它寻找没有命名空间的元素

doc.at('//xmlns:Relationship[@Id="rId3"]')[:Target]

作品

【讨论】:

以上是关于Nokogiri XML XPath 不选择 OpenXML 关系文件中的节点的主要内容,如果未能解决你的问题,请参考以下文章

为啥 .css 可以处理这个 Nokogiri 对象而不是 XPath? [复制]

使用Savon和Nokogiri在Rails中解析XML SOAP响应的内存不足

是否有类似于 lxml 或 nokogiri 的 Java 库? [关闭]

创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点

如何使用 Nokogiri 访问属性

python--爬虫(XPath与xml类库)