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。
如何解析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。