0

XML ファイル Report.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>
        <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>

つまり、親ノードの属性を保持し、兄弟ノードを保持します。分割は、Statistics ノードの子に対してのみ行う必要があります。

スニペットを次のように変更して、リンクに示されている回避策に従いました

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 ファイルの分割は次のとおりです。

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 ファイル分割を達成するための回避策を誰かが提供できますか?

4

2 に答える 2

0

あなたの xpath 評価は、子以下のみを探すことを表しています。他のフィールド、つまり統計プロパティに対しても追加の式を作成する必要があります。

于 2016-05-12T13:04:28.590 に答える