Xml解析并用Java编写另一个xml文件

时间:2015-03-12 08:17:27

标签: java xml xml-parsing

如何解析xml文件,以便将相同的节点多次写入另一个文件,一个接一个? 例如:

1.Xml file to be parsed:
 <?xml version="1.0" encoding="UTF-8"?>
  <ALL>
    <VER>7.0</VER>
    <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
    <DATA>
  </ALL>

2.因此,我希望这样做多次保存在另一个xml文件中:

<?xml version="1.0" encoding="UTF-8"?>
<ALL>
  <VER>7.0</VER>
   <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
   <MARKE>KIA</MARKE>
  <DATA>
 </ALL> 

<ALL>
 <VER>7.0</VER>
  <NATIONALITY>FIN</NATIONALITY>
  <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
    <DATA>
  </ALL>
  ...

这是我之前的问题:Copy nodes in the same output xml file -java

2 个答案:

答案 0 :(得分:1)

第二个示例不是XML文件。

添加外部标记并将appendChild添加到根目录并保存。 该文件将保持有效。

<?xml version="1.0" encoding="UTF-8"?>
  <ALLs>
    <ALL>
    <VER>7.0</VER>
    <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
    <DATA>
  </ALL>
  </ALLs>

您可以使用随机访问文件,跳转到最后,在写入新XML片段之前回位,然后再次写入ALL。这应该很快。

另一个对流有用的选项,总是编写XML头。

在这种情况下,你必须逐个解析,注意你传递给解析的InputStream没有关闭inputStream(使你自己的子类关闭,实际上,不关闭文件,并且外部关闭;否则XML解析器将关闭文件。

<?xml version="1.0" encoding="UTF-8"?>
<ALL>
  <VER>7.0</VER>
   <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
   <MARKE>KIA</MARKE>
  <DATA>
 </ALL> 

<?xml version="1.0" encoding="UTF-8"?>
<ALL>
 <VER>7.0</VER>
  <NATIONALITY>FIN</NATIONALITY>
  <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
    <DATA>
  </ALL>

使用的另一种选择,例如JSON;将您的XML转换为JSON并附加到文件;在阅读时,逐行阅读并根据需要将JSON转换为XML

答案 1 :(得分:0)

由于您的输出不包含单个根标记,因此它不是有效的XML。听起来你只想输出第一行文件然后重复后续行任意次数。 如果就是这种情况,您并不真正关心输入文件是[有效] XML的事实。您可以尝试以下内容:

final int cnt = 2;
Files.write(
    Paths.get("out.txt"),
    new AbstractList<String>() {
        private final List<String> mStrs = Files.readAllLines(Paths.get("in.xml"));

        public int size() {return 1 + (mStrs.size() - 1) * cnt;}

        public String get(int pIdx) {
            return
             pIdx == 0 ?
             mStrs.get(0) :
             mStrs.get((pIdx - 1) % (mStrs.size() - 1) + 1);
        }
    }
);

请注意,此解决方案假定存在输入XML标头。