我有一个遗留的文件格式,我正在转换为XML进行处理.结构可概括为:
<A>
<A01>X</A01>
<A02>Y</A02>
<A03>Z</A03>
</A>
Run Code Online (Sandbox Code Playgroud)
标签的数字部分可以从01到99,并且可能存在间隙.作为处理的一部分,某些记录可能添加了其他标记.处理完成后,我通过追踪树将文件转换回传统格式.文件相当大(约150,000个节点).
这样做的一个问题是,某些使用传统格式的软件假定标签(或转换时的字段)将按字母数字顺序排列,但默认情况下,新标签将添加到分支的末尾,然后分支的末尾导致它们以错误的顺序从迭代器中出来.
我可以使用XPath来查找,每次我来添加一个新的标签基于标签的名字前述兄弟,但我的问题是,是否有一个简单的树排序一次只是在出口前路?
编辑:
我想我总结了结构.
记录可以包含如上所述的几个级别,以提供如下内容:
<X>
<X01>1</X01>
<X02>2</X02>
<X03>3</X03>
<A>
<A01>X</A01>
<A02>Y</A02>
<A03>Z</A03>
</A>
<B>
<B01>Z</B02>
<B02>X</B02>
<B03>C</B03>
</B>
</X>
Run Code Online (Sandbox Code Playgroud) 我正在尝试对一些XML文档进行排序和规范化.期望的最终结果是:
除了#1,我已经实现了所有这些目标.
我一直在使用这个答案作为我的模板.这是我到目前为止:
import javax.xml.transform.stream.StreamResult
import javax.xml.transform.stream.StreamSource
import javax.xml.transform.TransformerFactory
import org.apache.xml.security.c14n.Canonicalizer
// Initialize the security library
org.apache.xml.security.Init.init()
// Create some variables
// Get arguments
// Make sure required arguments have been provided
if(!error) {
// Create some variables
def ext = fileInName.tokenize('.').last()
fileOutName = fileOutName ?: "${fileInName.lastIndexOf('.').with {it != -1 ? fileInName[0..<it] : fileInName}}_CANONICALIZED_AND_SORTED.${ext}"
def fileIn = new File(fileInName)
def fileOut = new File(fileOutName)
def xsltFile = new File(xsltName)
def temp1 = new File("./temp1") …Run Code Online (Sandbox Code Playgroud)