如何将XML文件压缩为一组xpath表达式?
考虑我有以下示例XML文件:
foo bar 00.00 USD 1
什么是将其展平为一组xpath表达式的最佳(最有效)方法。 另请注意:我想忽略任何命名空间和属性信息。 (如果需要,这也可以作为预处理步骤完成)。
所以我想得到输出:
/create/article/name /create/article/description /create/article/price/amount /create/article/price/currency /create/article/id
我正在用Java实现。
编辑: PS,我可能还需要这个在文本节点没有数据的情况下工作,所以例如,以下应该生成与上面相同的输出:
您可以使用XSLT轻松完成此操作。 看看你的例子,看起来你只想要包含文本的元素的XPath。 如果不是这样,请告诉我,我可以更新XSLT。
我创建了一个新的输入示例来展示它如何处理具有相同名称的兄弟姐妹。 在这种情况下,
。
XML输入
foo bar 00.00 USD 1 some name some description 00.01 USD 2
XSLT 1.0
产量
/create[1]/article[1]/name[1] /create[1]/article[1]/description[1] /create[1]/article[1]/price[1]/amount[1] /create[1]/article[1]/price[1]/currency[1] /create[1]/article[1]/id[1] /create[1]/article[2]/name[1] /create[1]/article[2]/description[1] /create[1]/article[2]/price[1]/amount[1] /create[1]/article[2]/price[1]/currency[1] /create[1]/article[2]/id[1]
UPDATE
要使XSLT适用于所有元素,只需从match="*[text()]"
删除[text()]
谓词。 这将输出每个元素的路径。 如果您不希望包含其他元素(如create,article和price)的元素的路径输出添加谓词[not(*)]
。 这是一个更新的例子:
新的XML输入
some name some description 00.01 USD 2
XSLT 1.0
产量
/create[1]/article[1]/name[1] /create[1]/article[1]/description[1] /create[1]/article[1]/price[1]/amount[1] /create[1]/article[1]/price[1]/currency[1] /create[1]/article[1]/id[1] /create[1]/article[2]/name[1] /create[1]/article[2]/description[1] /create[1]/article[2]/price[1]/amount[1] /create[1]/article[2]/price[1]/currency[1] /create[1]/article[2]/id[1]
如果删除[not(*)]
谓词,这就是输出的样子(为每个元素输出一个路径):
/create[1] /create[1]/article[1] /create[1]/article[1]/name[1] /create[1]/article[1]/description[1] /create[1]/article[1]/price[1] /create[1]/article[1]/price[1]/amount[1] /create[1]/article[1]/price[1]/currency[1] /create[1]/article[1]/id[1] /create[1]/article[2] /create[1]/article[2]/name[1] /create[1]/article[2]/description[1] /create[1]/article[2]/price[1] /create[1]/article[2]/price[1]/amount[1] /create[1]/article[2]/price[1]/currency[1] /create[1]/article[2]/id[1]
这是XSLT的另一个版本,速度提高了约65%:
我的建议是使用SAX解析器。 SAX的wiki条目 , Xerces:Apache的Java SAX解析器
在每个start元素上,将元素的名称添加到列表的末尾。 在每个结束元素上,删除最后一个列表条目。 当您遇到内容,并且想要输出xpath时,可以通过迭代列表来检索它。