有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

拆分xml而不在java中创建新元素到另一个文件

下面是我的XML,我想把它拆分成另一个文件,而不需要 创建一个新元素。 有没有办法根据子节点将该XML拆分为另一个XML 不创建新标签

File 1.xml
<Envelope>
<Data>
<SomeData>SampleData</SomeData>
<NextData>NextData</NextData>
</Data>
<Body>
<Name>ABC</Name>
<Age>12</Age>
<Country>India</Country>
</Body>
</Envelope>

File1是一个现有的文件,我希望file2只包含body的内容 如下图所示

File2.xml
<Body>
<Name>ABC</Name>
<Age>12</Age>
<Country>India</Country>
</Body>

此外,我希望文件2是一个新的文件,但我不希望 创建任何新元素。 我在这里提到的例子只有一种方法可以做到这一点 通过创建新元素 下面的链接使用创建新元素

*http://stackoverflow.com/questions/2056910/split-xml-in-multiple-xml-files*

我所指的守则:

public class XmlSplit {

public static void main(String [] args) throws Exception {
File input = new File("input.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc = dbf.newDocumentBuilder().parse(input);
XPath xpath = XPathFactory.newInstance().newXPath();

NodeList nodes = (NodeList) xpath.evaluate("//T0020/IRP_ACCOUNT", doc, XPathConstants.NODESET);

int itemsPerFile = 5;
int fileNumber = 0;
Document currentDoc = dbf.newDocumentBuilder().newDocument();
Node rootNode = currentDoc.createElement("T0020");
File currentFile = new File(fileNumber+".xml");
for (int i=1; i <= nodes.getLength(); i++) {
Node imported = currentDoc.importNode(nodes.item(i-1), true);
rootNode.appendChild(imported);

if (i % itemsPerFile == 0) {
writeToFile(rootNode, currentFile);

rootNode = currentDoc.createElement("T0020");
currentFile = new File((++fileNumber)+".xml");
}
}

writeToFile(rootNode, currentFile);
}

private static void writeToFile(Node node, File file) throws Exception {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(node), new StreamResult(new FileWriter(file)));
}
}

共 (1) 个答案

  1. # 1 楼答案

    我将使用XSLT转换并转换它
    Java代码:

    TransformerFactory factory = TransformerFactory.newInstance();
    Source xslt = new StreamSource(new File("Split.xslt"));
    Transformer transformer = factory.newTransformer(xslt);
    
    Source text = new StreamSource(new File("File1.xml"));
    transformer.transform(text, new StreamResult(new File("File2.xml")));
    

    文件:拆分。xslt

    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
    
        <xsl:output indent="yes" />
    
        <xsl:template match="/">
            <xsl:copy-of select="/Envelope/Body"/>
        </xsl:template>
    </xsl:stylesheet>
    

    输出文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <Body>
        <Name>ABC</Name>
        <Age>12</Age>
        <Country>India</Country>
    </Body>