繁体   English   中英

将一块XML提取到Java中的另一个XML文件中

[英]Extract a block of XML into another XML file in java

我有一个名为word.xml的XML文件,其中包含

<A> 
<Answer>How was you day</Answer> 
<Question>Happy day </Question>
<Biased> good morning </Biased>
<abc>..............</abc>
.
. // few more tags here
.
</A>

现在,我想提取另一个名为word1.xml的XML文件,其中包含word1.xml的一部分

<A> 
<Answer>How was you day</Answer> 
<Question>Happy day </Question>
</A>

到目前为止我尝试过的Java代码

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile {

public static void main(String args[]) {
try {

File stocks = new File("word.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(stocks);
doc.getDocumentElement().normalize();

System.out.println("root of xml file" + doc.getDocumentElement().getNodeName());
NodeList nodes = doc.getElementsByTagName("A");
System.out.println("==========================");

for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
System.out.println("i value---"+i);
System.out.println(nodes.getLength());
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
System.out.println(element.getTextContent());
//element.getElementsByTagName(name)
File statText = new File(i+".txt");
FileOutputStream is = new FileOutputStream(statText);
OutputStreamWriter osw = new OutputStreamWriter(is);    
Writer w = new BufferedWriter(osw);
w.write("<Answer>");
w.write(element.getElementsByTagName("Answer").item(0).getTextContent());
w.write("</Answer>");
w.write("Question");
w.write(element.getElementsByTagName("Question").item(0).getTextContent());
w.write("</Question>");
w.close();
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}

private static String getValue(String tag, Element element) {
NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();
Node node = (Node) nodes.item(0);
return node.getNodeValue();
}
}
}

我只想在结果中包含标签。 这是肮脏的方式。 你能建议我最好的方法吗?需要帮助。 提前致谢。

如果Java不是强制性约束,则可以使用XSLT来实现。 很容易遵循。 您可以在此处找到一些指导: 链接

我自己的做法的一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:for-each select="//title">
        <article>
            <title> 
                <xsl:value-of select="./name/>
                <xsl:text> : </xsl:text>
                <xsl:value-of select = "./number/>
            </title>
            <references>
                <xsl:value-of select = "reference"/>
            </references>
        </article>
    </xsl:for-each> 
</xsl:template>

希望能帮助到你!

就像BeginnerJava解释的那样,在将一棵XML树转换为另一棵XML树时,XSL是最合适的技术,而XSL就是为此而设计的。 在XSL中,实现您所描述的代码将是(我略过了一些):

<xsl:template match="A">
    <xsl:copy>
      <xsl:apply-templates select="Answer|Question"/>
    </xsl:copy>
</xsl:template>

您可以从Java代码或从命令行调用XSL转换,如下所示:

java  net.sf.saxon.Transform   [options]   source-document   stylesheet   [ params…]

使用DocumentParser将xml解析为DOM。 从结果文档中删除不需要的元素。 使用Transformer将修改后的文档写入新文件。 (请注意,这些步骤中每个步骤的详细信息都可以在在线的数千篇Java xml教程中找到)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM