、Report.xmlをXMLファイルを考えてみましょう:分割より大きなサイズのXMLファイルをJavaを使用して(親の属性と兄弟を保持)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Report FileName="abc.bin" reportDate="05/12/2016 02:44:22 AM">
<Statistics>
<child value="abc">
<subchild>...</subchild>
</child>
<child value="xyz">
<subchild>...</subchild>
</child>
</Statistics>
<Properties>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</childn>
</Properties>
<OverallStatistics>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</child1>
</OverallStatistics>
</Report>
私はちょうどとして上記のXMLファイルを分割したい:
ReportSplit1 .xmlの
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Report FileName="abc.bin" reportDate="05/12/2016 02:44:22 AM">
<Statistics>
<child value="abc">
<subchild>...</subchild>
</child>
</Statistics>
<Properties>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</childn>
</Properties>
<OverallStatistics>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</child1>
</OverallStatistics>
</Report>
ReportSplit2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Report FileName="abc.bin" reportDate="05/12/2016 02:44:22 AM">
<Statistics>
<child value="xyz">
<subchild>...</subchild>
</child>
</Statistics>
<Properties>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</childn>
</Properties>
<OverallStatistics>
<child1>...</child1>
<child2>...</child2>
.
.
.
<childn>...</child1>
</OverallStatistics>
</Report>
、すなわち、親ノードの属性を保持し、兄弟ノードを保持する。分割は、統計ノードの子に対してのみ行う必要があります。
はpackage xmlsplitting;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.*;
public class XmlSplit
{
static public void main(String[] arg) throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("D:\\Analyzer\\FileSplit\\Report.xml");
TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList list = (NodeList)xpath.evaluate("//Report/Statistics/child", doc, XPathConstants.NODESET);
for (int i=1; i<list.getLength(); i++)
{
Node element = list.item(i).cloneNode(true);
if(element.hasChildNodes())
{
Source src = new DOMSource(element);
FileOutputStream fs = new FileOutputStream("D:\\Analyzer\\FileSplit\\ReportSplit"+ i + ".xml");
Result dest = new StreamResult(fs);
aTransformer.transform(src, dest);
fs.close();
}
}
}
}
達成XMLファイルの分割のようにスニペットを変更することにより、linkで与えられた回避策を追っ:
ReportSplit1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<child value="abc">
<subchild>...</subchild>
</child>
ReportSplit2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<child value="xyz">
<subchild>...</subchild>
</child>
誰でも希望のXMLファイルを分割するための回避策を提供できますか?