从"非结构化"解析XML纯文本

时间:2015-02-03 16:11:05

标签: java xml

我正在使用发布系统中的大型文本文件。其结构如下:

-- 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。任何想法都非常感激,但

2 个答案:

答案 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
    }

比解析每一行容易一些......