3

我有一个巨大的文本文件,我想编写一个程序,它只能从文件中提取 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>

4

3 回答 3

1

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

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

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

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

于 2012-06-07T20:04:14.943 回答
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;
于 2012-06-19T20:56:24.350 回答
0

考虑看看这些 Java XML Parsing:

于 2012-06-07T19:56:21.890 回答