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 であるファイルが 1 つある場合と、XML の複数のフラグメントを含むファイルがある場合があります。

前者の場合、XML ドキュメントの構造化されたコンテンツを取得するために XML 処理 (SAX、DOM など) について学ぶ必要がある場合は、そのコンテンツをその構造と共に保存できます。これは、XML ドキュメントを再フォーマットする場合に便利です (ネストされたタグでのタブ移動や、すべてを 1 行にまとめるなど)。

後者の場合は、パーサーを作成してから、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 解析については、以下を参照してください。

于 2012-06-07T19:56:21.890 に答える