gpt4 book ai didi

java - 使用多个 XPath 表达式展平 XML

转载 作者:行者123 更新时间:2023-12-02 08:45:12 27 4
gpt4 key购买 nike

我正在寻找一种通用算法,可以在给定多个 XPath 表达式的情况下将 XML 文件平铺到表中,但由于可用 XPath 引擎实现的性质,我尝试过的所有方法都失败了。

给定一个 XML:

<A Name="NameA">
<B Name="NameB1">
<C Name="NameC1"/>
<C Name="NameC2"/>
<C Name="NameC3"/>
</B>
<B Name="NameB2">
<C Name="NameC4"/>
<C Name="NameC5"/>
<C Name="NameC6"/>
</B>

以及以下 XPath 表达式作为输入:

/A/@Name
/A/B/@Name
/A/B/C/@Name

输出应该是以下形式的表格:

姓名A 姓名B1 姓名C1

姓名A 姓名B1 姓名C2

姓名A 姓名B1 姓名C3

姓名A 姓名B2 姓名C4

姓名A 姓名B2 姓名C5

姓名A 姓名B2 姓名C6

我试图使用可用的 Java XML 包(例如 javax.xml.xpath、jdom 等)访问此表,但无济于事。

好像是

XPath.evaluate("/A/B/C/@Name", doc, XPathConstants.NODESET);

代码将返回一个无法遍历的“分离”节点。

我在 XPath 评估的节点上尝试了多种递归方法,但均无济于事。还想到了 DOM 树的 DFS 遍历,但所有 XPath 求值器似乎都返回分离的节点,其中 node.getParent() 将始终返回“null”。

对于可以跟踪嵌套 XPath 表达式的“多 XPath 表达式感知”算法有什么想法吗?

我感觉这可以通过 XSLT 轻松实现,但我的 XSLT 技能还很生疏......

最佳答案

此 XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />

<xsl:template match="/">
<table>
<!--Based upon your comments, it sounds as if you don't know what the structure of the XML you will be dealing with is(element nesting or attribute names).
That makes it a little bit difficult.
Based upon the example XML you gave the following for-each will work:-->
<xsl:for-each select="//C"> <!--You could also use "/A/B/C" -->
<tr>
<!--This looks up the node tree and creates a column for the current element, as well as for each of it's parents, using the first Attribute as the value.-->
<xsl:for-each select="ancestor-or-self::*">
<td><xsl:value-of select="@*[1]"/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>

</xsl:stylesheet>

适用于提供的 XML 并生成以下内容:

<?xml version="1.0" encoding="UTF-16"?>
<table>
<tr>
<td>NameA</td>
<td>NameB1</td>
<td>NameC1</td>
</tr>
<tr>
<td>NameA</td>
<td>NameB1</td>
<td>NameC2</td>
</tr>
<tr>
<td>NameA</td>
<td>NameB1</td>
<td>NameC3</td>
</tr>
<tr>
<td>NameA</td>
<td>NameB2</td>
<td>NameC4</td>
</tr>
<tr>
<td>NameA</td>
<td>NameB2</td>
<td>NameC5</td>
</tr>
<tr>
<td>NameA</td>
<td>NameB2</td>
<td>NameC6</td>
</tr>
</table>

关于java - 使用多个 XPath 表达式展平 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1963927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com