Xml 正在解析并写入 Java 中的另一个 xml 文件

Xml parsing and writing to another xml file in Java

如何解析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.As一个结果,我想这样做是保存在另一个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>
  ...

这是我之前的问题:

第二个示例不是 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 header。

在这种情况下,你必须解析 one-by-one,注意你为解析传递的 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,如您所愿

由于您的输出不包含单个根标记,因此它将无效 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 header。