我需要转换具有嵌套(分层)结构形式的大型XML文件
<Root>
Flat XML
Hierarchical XML (multiple blocks, some repetitive)
Flat XML
</Root>
变成更扁平(“切碎”)的形式,每个重复的嵌套块有1个块。
数据具有许多不同的标签和层次结构变化(尤其是在层次XML之前和之后的切碎XML的标签数量),因此,理想情况下,不应对标签和属性名称或层次级别进行任何假设。
仅4个级别的层次结构的顶层视图看起来像
<Level 1>
...
<Level 2>
...
<Level 3>
...
<Level 4>A</Level 4>
<Level 4>B</Level 4>
...
</Level 3>
...
</Level 2>
...
</Level 1>
然后所需的输出将是
<Level 1>
...
<Level 2>
...
<Level 3>
...
<Level 4>A</Level 4>
...
</Level 3>
...
</Level 2>
...
</Level 1>
<Level 1>
...
<Level 2>
...
<Level 3>
...
<Level 4>B</Level 4>
...
</Level 3>
...
</Level 2>
...
</Level 1>
也就是说,如果在每个级别i
上都有Li
不同的组件,那么Product(Li)
将产生总共不同的组件(上面仅2个,因为唯一的差异因子是4级,所以L1*L2*L3*L4 = 2
)。
从我所看到的情况来看,XSLT可能是可行的方法,但是任何其他解决方案(例如StAX甚至JDOM)都可以。
使用虚构信息的更详细示例是
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="US">
<Comment>List of previous jobs in the US</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title = "Senior Developer">
<StartDate>01/10/2001</StartDate>
<Months>38</Months>
</Job>
<Job title = "Senior Developer">
<StartDate>01/12/2004</StartDate>
<Months>6</Months>
</Job>
<Job title = "Senior Developer">
<StartDate>01/06/2005</StartDate>
<Months>10</Months>
</Job>
</JobDetails>
</Employment>
</EmploymentHistory>
<EmploymentHistory>
<Employment country="UK">
<Comment>List of previous jobs in the UK</Comment>
<Jobs>2</Jobs>
<JobDetails>
<Job title = "Junior Developer">
<StartDate>01/05/1999</StartDate>
<Months>25</Months>
</Job>
<Job title = "Junior Developer">
<StartDate>01/07/2001</StartDate>
<Months>3</Months>
</Job>
</JobDetails>
</Employment>
</EmploymentHistory>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employee>
上面的数据应切分成5个块(即,每个不同的<Job>
块一个),每个块将使所有其他标签保持相同,并且只有一个<Job>
元素。因此,鉴于<Job>
以上示例中有5个不同的块,转换后的(“切碎的”)XML将是
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="US">
<Comment>List of previous jobs in the US</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title = "Senior Developer">
<StartDate>01/10/2001</StartDate>
<Months>38</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="US">
<Comment>List of previous jobs in the US</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title = "Senior Developer">
<StartDate>01/12/2004</StartDate>
<Months>6</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="US">
<Comment>List of previous jobs in the US</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title = "Senior Developer">
<StartDate>01/06/2005</StartDate>
<Months>10</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="UK">
<Comment>List of previous jobs in the UK</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title = "Junior Developer">
<StartDate>01/05/1999</StartDate>
<Months>25</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="UK">
<Comment>List of previous jobs in the UK</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title = "Junior Developer">
<StartDate>01/07/2001</StartDate>
<Months>3</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
给定以下XML:
<?xml version="1.0" encoding="utf-8" ?>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="US">
<Comment>List of previous jobs in the US</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title = "Developer">
<StartDate>01/10/2001</StartDate>
<Months>38</Months>
</Job>
<Job title = "Developer">
<StartDate>01/12/2004</StartDate>
<Months>6</Months>
</Job>
<Job title = "Developer">
<StartDate>01/06/2005</StartDate>
<Months>10</Months>
</Job>
</JobDetails>
</Employment>
<Employment country="UK">
<Comment>List of previous jobs in the UK</Comment>
<Jobs>2</Jobs>
<JobDetails>
<Job title = "Developer">
<StartDate>01/05/1999</StartDate>
<Months>25</Months>
</Job>
<Job title = "Developer">
<StartDate>01/07/2001</StartDate>
<Months>3</Months>
</Job>
</JobDetails>
</Employment>
</EmploymentHistory>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employee>
以下XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Output>
<xsl:apply-templates select="//Employee/EmploymentHistory/Employment/JobDetails/Job" />
</Output>
</xsl:template>
<xsl:template match="//Employee/EmploymentHistory/Employment/JobDetails/Job">
<Employee>
<xsl:attribute name="name">
<xsl:value-of select="ancestor::Employee/@name"/>
</xsl:attribute>
<Address>
<xsl:value-of select="ancestor::Employee/Address"/>
</Address>
<Age>
<xsl:value-of select="ancestor::Employee/Age"/>
</Age>
<EmploymentHistory>
<Employment>
<xsl:attribute name="country">
<xsl:value-of select="ancestor::Employment/@country"/>
</xsl:attribute>
<Comment>
<xsl:value-of select="ancestor::Employment/Comment"/>
</Comment>
<Jobs>
<xsl:value-of select="ancestor::Employment/Jobs"/>
</Jobs>
<JobDetails>
<xsl:copy-of select="."/>
</JobDetails>
<Available>
<xsl:value-of select="ancestor::Employee/Available"/>
</Available>
<Experience>
<xsl:attribute name="unit">
<xsl:value-of select="ancestor::Employee/Experience/@unit"/>
</xsl:attribute>
<xsl:value-of select="ancestor::Employee/Experience"/>
</Experience>
</Employment>
</EmploymentHistory>
</Employee>
</xsl:template>
</xsl:stylesheet>
提供以下输出:
<?xml version="1.0" encoding="utf-8"?>
<Output>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="US">
<Comment>List of previous jobs in the US</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title="Developer">
<StartDate>01/10/2001</StartDate>
<Months>38</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="US">
<Comment>List of previous jobs in the US</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title="Developer">
<StartDate>01/12/2004</StartDate>
<Months>6</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="US">
<Comment>List of previous jobs in the US</Comment>
<Jobs>3</Jobs>
<JobDetails>
<Job title="Developer">
<StartDate>01/06/2005</StartDate>
<Months>10</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="UK">
<Comment>List of previous jobs in the UK</Comment>
<Jobs>2</Jobs>
<JobDetails>
<Job title="Developer">
<StartDate>01/05/1999</StartDate>
<Months>25</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
<Employee name="A Name">
<Address>123 A Street</Address>
<Age>28</Age>
<EmploymentHistory>
<Employment country="UK">
<Comment>List of previous jobs in the UK</Comment>
<Jobs>2</Jobs>
<JobDetails>
<Job title="Developer">
<StartDate>01/07/2001</StartDate>
<Months>3</Months>
</Job>
</JobDetails>
<Available>true</Available>
<Experience unit="years">6</Experience>
</Employment>
</EmploymentHistory>
</Employee>
</Output>
这就是你想要的吗?
您也许还可以使用xsl:copy复制更高级别的元素,但是我需要再考虑一点。使用上面的xslt,您可以控制更多,但还必须重新定义元素…
问题内容: 我正在尝试使用Groovy和Java的ScriptEngine API解析XML。下面的代码正是这样做的,但是我想知道是否有更好的方法可以做到这一点。还有与此相关的性能影响吗? 输出: 问题答案: 您的Groovy脚本可能是 “ groovy-er” … 这做同样的事情: 确实,您可以使用而不是JVM脚本引擎,这可以使您了解:
本文向大家介绍Java通过BCrypt加密过程详解,包括了Java通过BCrypt加密过程详解的使用技巧和注意事项,需要的朋友参考一下 一、概述 在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。 目前,MD5和BCrypt比较流行。相对来说,BCryp
我可以用PHP脚本XSLTProcessor来完成吗?我可以从WordPress中的页面调用PHP脚本吗?如果是,我将PHP脚本保存在哪里?也许是这样的? 我对WordPress和PHP不是很熟悉,所以欢迎任何建议。其他信息:使用Pagelines主题和WordPress 3.4.1
本文向大家介绍通过实例了解java TransferQueue,包括了通过实例了解java TransferQueue的使用技巧和注意事项,需要的朋友参考一下 序言 本文主要简介一下TransferQueue。 TransferQueue TransferQueue(java7引入)继承了BlockingQueue(BlockingQueue又继承了Queue)并扩展了一些新方法。生产者会一直阻塞
问题内容: 我从这里获得了XSLT:http : //andrewjwelch.com/code/xslt/csv/csv-to- xml_v2.html 并将CSV文件转换为XML文档。在命令行上与以下命令一起使用时,它将执行此操作: java -jar saxon9he.jar -xsl:csv-to-xml.csv -it:main -o:output.xml 现在,问题变成了: 如何在Ja
主要是从这个问题:XSLT:CSV(或平面文件,或纯文本)到XML 我这里有一个XSLT:http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html 它将CSV文件转换为XML文档。当与命令行上的以下命令一起使用时,它会这样做: java-jar saxon9he。jar-xsl:csv到xml。csv-it:main-o:output。xml