【问题标题】:Trouble splitting xml file evenly无法均匀拆分 xml 文件
【发布时间】:2018-10-31 22:00:41
【问题描述】:

我无法根据元素数将大型 xml 文件拆分为更小的文件。我从上一个问题中找到了一些代码,这些代码可用于按标签拆分,但似乎无法按元素计数拆分文件。将元素计数设置为 100 后将创建一个文件。如果我增加计数,文件的大小会增加,但不会创建多个文件来占整个原始 xml 文件。

public class Splitter {
    private static void appendStuff(String content, File file) throws IOException {
        FileWriter fw = new FileWriter(file.getAbsoluteFile(),true);
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(content);
        bw.close();
    }

    public static void main(String[] s) throws Exception {
        String prefix = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "\n";
        String suffix = "\n</RCStatus>\n";
        int count = 0;
        try {

            int i = 1;
            XMLInputFactory xif = XMLInputFactory.newInstance();
            XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("Carriers.xml"));
            xsr.nextTag(); // Advance to statements element

            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer t = tf.newTransformer();

            File file = new File("\\Desktop\\xml\\" + "status" + i + ".xml");
            FileOutputStream fos = new FileOutputStream(file, true);
            appendStuff("<RCStatus>", file);
            while (xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {
                count++;
                t.transform(new StAXSource(xsr), new StreamResult(fos));
                if(count == 100) {
                    count = 0;
                    i++;
                    appendStuff("</RCStatus>", file);
                    fos.close();
                    file = new File("\\Desktop\\xml\\" + "status" + i +".xml");
                    fos = new FileOutputStream(file, true);
                    appendStuff("<RCStatus>", file);
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

<RCStatus> 
  <H> 
    <T>a</T> 
      <A>E</A> 
      <V>12</V> 
      <R>S</R> 
   </H> 
   <C> 
    <Co>I</Co> 
    <RM>5</RM> 
    <Ta/> 
    <MC>xx</MC> 
    <DOT>1</DOT> 
    <A1>xxx</1> 
    <A2 /> 
    <Cy>x</Cy> 
    <St>I</St> 
    <Z>x</Z> 
    <Ct>xx</Ct> 
    <T>VP</T> 
    <P>x</P> 
    <F>xxx</F> 
    <E>x</E> 
    <Pa /> 
    <PaA /> 
    <PaC /> 
    <PaSt /> 
    <PaZ /> 
    <Cl = /> 
    <iISN /> 
    <iISS /> 
    <Ds /> 
    <Pay2 /> 
    <PC /> 
    <C>U</C> 
    <IF /> 
   </C> 
</RCStatus>

【问题讨论】:

  • 你能发布一个(小)示例 xml 文件来查看它的结构吗?
  • @aka-one 我已编辑问题以包含代码的 sn-p
  • 我现在看到 xml 文件被拆分为一个较小的文件,其中包含前 1,000 行重复 4 次而不是前 4,000 行。

标签: java xml


【解决方案1】:

XML 文件是表示树结构的平面文件。

树结构不需要在 XML 文件中平衡,所以主要问题是“什么是不平衡树的均匀分割”?

为了说明,您的树有一个顶级元素 RCStatus 和两个兄弟元素 HC。如果我将树平均分配给兄弟姐妹,我将得到一个较小的文件(包含H 兄弟姐妹的文件)和一个较大的文件(包含C 兄弟姐妹的文件)。

也许这就是我们想要的。也许不是。

第二种方法是“包含相同数量的叶元素”,然后文件将仅大致相等,因为两个文件的父元素的结构可能不同,从而导致大小变化。

所以,我认为您需要更好地表达拆分的含义,因为将 XML 文件从字面上切割成两半会使其成为无效的非 XML 文件。

【讨论】:

  • 嗯,我有一个大的 xml 文件,我想根据标签 RCStatus 进行拆分。我说均匀是因为我试图让每个文件包含 100 个元素。
猜你喜欢
  • 2020-10-15
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2021-07-11
相关资源
最近更新 更多