如何从纯文本文件中提取嵌入的XML内容?

时间:2012-06-07 19:47:31

标签: java xml

我有一个巨大的文本文件,我想编写一个程序,只能从文件中提取XML并保存。

是否存在直接API或更好的解决方案,而不是分割/修剪从文件中读取的字符串。

实施例: 文件的一小部分:

#---------- #1 :  ----------#
<MSG_INFO>
<message type="TextMessage" messageSelector="" originationTimestamp="" receiveTime="" jmsServerTimestamp="" jmsMsgExpiration="">
    <header JMSDestinationType="Generic" JMSDeliveryMode="2" />
    <properties>
        <property name="messageTopic" type="String">xyz</property>
    </properties>
</message>

 BodyLength=1476
<?xml version="1.0"?>
<catalog>
<book id="bk101">
  <author>Gambardella, Matthew</author>
  <title>XML Developer's Guide</title>
  <genre>Computer</genre>
  <price>44.95</price>
  <publish_date>2000-10-01</publish_date>
  <description>An in-depth look at creating applications 
  with XML.</description>
</book>
<book id="bk102">
  <author>Ralls, Kim</author>
  <title>Midnight Rain</title>
  <genre>Fantasy</genre>
  <price>5.95</price>
  <publish_date>2000-12-16</publish_date>
  <description>A former architect battles corporate zombies, 
  an evil sorceress, and her own childhood to become queen 
  of the world.</description>
</book>

3 个答案:

答案 0 :(得分:1)

通常,XML文件是一个文本文件,因此要么您有一个XML文件,要么您有一个包含多个XML片段的文件。

如果是前者,您需要了解XML处理(SAX,DOM等)以获取XML文档的结构化内容,那么您可以使用它的结构保存该内容。这在想要重新格式化XML文档时非常有用(嵌套标签中的标签或将所有内容放在一行上都是示例)。

如果是后者,则需要编写解析器然后使用XML处理工具。第一个解析器将查找看似是开放XML标记的任何内容,然后跟踪标记在文本文件中的位置,计算后续的打开和关闭标记,直到它检测到它离开了初始标记的顶级嵌套。然后它需要将嵌入的文本块传递(不传入文档的其余部分)到适当的XML解析工具,然后可以形成XML的代表性视图,然后可以将其重新处理回文本以保存在其中自己的文件。

当然,后者可以进行优化,以便在检测到XML开始和结束边界后不实际解析XML;但是,如果没有实际解析XML,就不能保证生成的文本块实际上是有效的XML。

答案 1 :(得分:1)

正则表达式就是答案。

String[] newXml = xml.split("\\<\\?");
    ArrayList<String> xmlList = new ArrayList<>(Arrays.asList(newXml));
    for(int i = 0; i<xmlList.size();i++){
        if(!xmlList.get(i).contains("xml version=\"1.0\" encoding=\"UTF-8\"")){
            xmlList.remove(i);
        }

    }
    for(int j = 0;j<xmlList.size();j++){
        xmlList.set(j, "<?"+xmlList.get(j));
        xmlList.set(j,xmlList.get(j).split("\\#")[0]);
    }


    return xmlList;

答案 2 :(得分:0)

考虑查看Java XML Parsing: