如何解析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>
...
答案 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标头。