我正在使用发布系统中的大型文本文件。其结构如下:
-- File header
-- File Attribute 1
-- File Attribute 2
<xml>File summary</xml>
-- Record header
-- Record attribute 1
<xml>Record1</xml>
-- Record 1 header
-- Record attribute 1
<xml>Record1</xml>
-- Record 2 header
-- Record attribute 1
<xml>Record2</xml>
-- Record n header
-- Record attribute 1
<xml>Recordn</xml>
文件中可能有数十万条记录,而XML是一个大型结构在一行。线条大小可能长达数千个字符。
首先,是的,这是疯狂的 - 我的第一个任务是回到发布系统并解释XML是如何工作的! ;)与此同时,我需要一种剥离XML并构建结构化输出文件的方法:
<xml>
<header/>
<listofrecords>
<record1/>
<record2/>
<recordn/>
</listofrecords>
</xml>
请注意,我对文本标题内容的内容不感兴趣。
我正在努力做出最快,最可维护的方法。
我的想法是使用Java和BufferedReader逐行解析输入文件。在遇到XML标记的地方,我读到了结束XML标记并添加到输出文件结构。
有更快的方法吗? RegEx可以帮助识别我需要提取到新格式的文本吗?
很抱歉这是一个非常开放的问题,我知道它是否不适合Stack Overflow。任何想法都非常感激,但
答案 0 :(得分:1)
我会使用perl脚本
#! /usr/bin/perl
#
print "<xml>\n";
while($line = <>) {
if ($line =~ m!-- File (.*)!) {
print " <header $1/>\n";
print " <listofrecords>\n";
last;
}
}
while($line = <>) {
if($line =~ m!<xml>(.*)</xml!) {
print " <$1/>\n";
}
}
print " </listofrecords>\n";
print "</xml>";
答案 1 :(得分:0)
您可以考虑使用DOM解析器。如果您正在处理一个这样的大文件,请用某个标记将其包围,以使其成为有效的XML,例如
<top>
...file contents...
</top>
String xmlPath = "C:/test/xml/publishing_file.xml";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(xmlPath);
NodeList nl = dom.getDocumentElement().getChildNodes();
for(int i = 0; i < nl.getLength(); i++){
//...this sequence of nodes will be each <xml> tag followed by the text contents between it
}
比解析每一行容易一些......