首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中将多层xml简化为List<String xpath >?

如何在java中将多层xml简化为List<String xpath >?
EN

Stack Overflow用户
提问于 2015-02-07 17:20:38
回答 1查看 1.1K关注 0票数 0

其目的是在叶级将多级重复的xml扁平化为xpath;这样我们就可以将它存储在键值存储中并检索它。假设每个重复节点都有一个UID。

  1. 生成一个成对列表,其中键为"XPATH“,值为该叶的实际值。
  2. 应该能够将其组装回xml中。
  3. xml由xsd支持(有JAXB解决方案吗)

编辑并用一个更简单的xml替换了以前的xml。

示例xml如下所示

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car uid="WxiMr123">
        <carDoor uid="WRP2">
            <location uid="loc-1">
                <width uom="ft">2</width>
                <height uom="ft">3</height>
            </location>
            <location uid="loc-2">
                <width uom="m">5</width>
                <height uom="m">7</height>
            </location>
        </carDoor>
        <commonData>
            <timeCreated>2001-04-30T08:15:00.000Z</timeCreated>
        </commonData>        
    </car>    
</cars>

我看到的xpath K,V对应该看起来像

代码语言:javascript
复制
/cars/car[@uid="WxiMr123"]@uid , "WxiMr123"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]@uid, "WRP2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]@uid, "loc-1"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/width[@uom="ft"]@uom, "ft"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/width[@uom="ft"]/text(), "2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/height[@uom="ft"]@uom, "ft"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/height[@uom="ft"]/text(), "3"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]@uid, "loc-2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/width[@uom="m"]@uom, "m"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/width[@uom="m"]/text(), "5"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/height[@uom="m"]@uom, "m"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/height[@uom="m"]/text(), "7"
/cars/car[@uid="WxiMr123"]/commonData/timeCreated/text(), "2001-04-30T08:15:00.000Z"

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-07 21:45:50

制作所需的文件并不那么困难。例如,以下样式表:

XSLT1.0

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <xsl:for-each select="//text() | //@*[string()]">
        <xsl:for-each select="ancestor::*">
            <xsl:value-of select="concat('/', name())" />
                <xsl:for-each select="@*">
                    <xsl:value-of select="concat('[@', name(), '=&quot;', ., '&quot;]')" />
                </xsl:for-each>
        </xsl:for-each>
        <xsl:choose>
            <xsl:when test="name()">
                <xsl:value-of select="concat('/@', name())" />
            </xsl:when>
            <xsl:otherwise>/text()</xsl:otherwise>
        </xsl:choose>
        <xsl:value-of select="concat(', &quot;', ., '&quot;&#10;')" />
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

当应用于示例输入时,将生成以下结果

代码语言:javascript
复制
/cars/car[@uid="WxiMr123"]/@uid, "WxiMr123"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/@uid, "WRP2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/@uid, "loc-1"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/width[@uom="ft"]/@uom, "ft"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/width[@uom="ft"]/text(), "2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/height[@uom="ft"]/@uom, "ft"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/height[@uom="ft"]/text(), "3"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/@uid, "loc-2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/width[@uom="m"]/@uom, "m"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/width[@uom="m"]/text(), "5"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/height[@uom="m"]/@uom, "m"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/height[@uom="m"]/text(), "7"
/cars/car[@uid="WxiMr123"]/commonData/timeCreated/text(), "2001-04-30T08:15:00.000Z"

Note

  1. 这可能不是最有效的方法;对于大型XMl文档,最好应用模板/s递归遍历整个树;
  2. 元素可能具有多个属性;您的示例没有说明如何在构建路径时处理这些属性;
  3. 元素可能位于名称空间中;您的示例没有说明如何处理这些元素;
  4. 空节点被排除在外;如果您试图从此转换的结果中重构原始XML文档(我不知道如何实现),这些节点就会丢失。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28385062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档