【发布时间】:2018-11-23 15:23:53
【问题描述】:
给定一个定义了多个命名空间的 XML 文件,使用 XPath 查询在 DOM 中搜索默认命名空间中的元素的最简单方法是什么?
正如标题所示,这是使用 Perl 和 libXML。
此外,是否可以在不硬编码命名空间的情况下执行此操作(如果使用 XPathContext 定义命名空间是否可以查询文件的默认命名空间)
我想要达到的目标:
我正在为某些公式搜索许多不同年龄的 xlsx 电子表格文档并处理这些。
我打算只使用一个简单的findnodes(//f) 来收集每张表中的所有公式。
所有工作表都定义了多个命名空间,但大多数元素似乎没有完全限定的命名空间。例如:
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
<sheetData>
<row r="1">
<c r="A1">
<f>SUM(1+2)</f>
<v>3</v>
</c>
<c r="A2">
<f>SUM(4+5)</f>
<v>9</v>
</c>
...
<controls>
<mc:AlternateContent xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
<mc:Choice Requires="x14">
<control shapeId="1" r:id="rId4" name="blah">
...
正如我上面提到的,我只关心公式,即:在上面的示例中,“SUM(1+2)”和“SUM(4+5)”。
我怎样才能只提取这些数据?
解决方案不一定要漂亮,但必须始终有效(我不确定命名空间是否有很大变化。)
我可以通过 grep/sed 管道传输所有内容,但希望正确解析它不会太难...
【问题讨论】:
-
默认命名空间只存在于语法中。在 DOM 模型中,每个元素都属于一个命名空间,没有办法检测它是否是默认的——事实上,具有默认命名空间的文档和每个元素明确提到的具有相同命名空间的文档在语义上是一致的相等的。为什么需要它?
-
嗯,好的,我将在问题中添加更多上下文...
-
findnodes('//*[local-name()="f"]')返回什么?其他命名空间中是否有您不想要的fs? -
谢谢@choroba - 如果我确实拾取额外的元素(即使它们是垃圾)对我的用例来说并不重要,因为我稍后会进一步处理这些元素。无论如何,使用该 XPath 语法对我有用 - 随时将其粘贴为答案:)
标签: perl xpath xml-libxml