2012-06-07 33 views
2

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

+0

我不明白。你是说你有一个嵌入了XML'片段'的文本文件吗? Java有多种可用于解析(格式良好)的XML的API。 –

+2

@AndrewThompson说的。 “只有XML”是什么意思?你能举一个简单的例子吗? –

+0

用户是否要在输入中输入整个xml文件?然后CDATA吧! – Alfabravo

回答

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; 
+0

顺便说一下,这只给出文档中的第一个XML。但我们总是可以使用递归技术来获得所有这些。 – Piyush

+0

这是一个非饥饿的模式,如果文件在xml之前和之后包含原始文本,则会提取第一个xml文件。 ?将不会帮助你在那里有一个解决方法。 –

0

考虑采取看看这些为Java XML解析:

+0

这些都可以从文本文件(包含XML和普通文本)中提取xml吗?谢谢 – Piyush

1

一般的XML文件是文本文件,所以要么你有一个文件,它是XML,或者你有一个包含XML的多个片段的文件。

如果是前者,你需要了解XML处理(SAX,DOM等)来获取XML文档的结构化内容,然后就可以保存这些内容与它的结构。这在想要重新格式化XML文档时很有用(嵌套标签中的标签或将所有内容放在一行上都是示例)。

如果是后者,则需要编写解析器然后使用XML处理工具。第一个解析器将查找任何看起来是开放XML标记的东西,然后跟踪标记在文本文件中的位置,计算后续的打开和关闭标记,直到它检测到它离开最初标记的顶层嵌套为止。然后,它需要将嵌入的文本块传递给相应的XML解析工具,然后可以形成XML的表示视图,然后可以将其重新处理回文本以保存在文本中自己的文件。

当然,后者可以优化实际上并不解析XML它的开始,并已检测结束分界后;但是,如果不实际解析XML,则不能保证所得到的文本块实际上是有效的XML。

相关问题