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