2011-03-01 50 views
0

ランダムな文字列を持つので、そこからXML文書を抽出する方法は?Java - 文字列からXML文書を抽出する

Stringには、(不完全な)、1つの(完全な)、または複数のドキュメントを保持できないと考えてください。

この問題を解決するためのテンプレート/ツールはありますか?

LE:XMLデータはTCP/IP経由で

答えて

1

を取得しているとき、私は自動的に壊れたXML文書を処理することができます既存のソリューションを知らない場合を考えます。 XMLは、非常に厳密な標準であり、エラーを解析する際に余裕がほとんどありません。あなたは自分の好きにしなさい。

XMLエディタのコードを見てみることができます。彼らは壊れた文書を扱うことができなければなりませんが、私はそのうちのどれかが開始要素の欠落などを扱うことができるとは考えていません。

2

複数の文書が課題となっている...私は、これは、少なくとも有効なXMLドキュメントにコンテンツを変換するだろう、追加の「ルート」に文字列をラップしたい:

String xml = "<my-own-root-element>" + getString() + "</my-own-root-element>"; 

だけでスタート。もちろん、xmlスキーマとdoctypeについては忘れてしまいます。さまざまな文字エンコーディングが課題になることがあり、<?xml ... ?>の処理手順を除外しなければならない場合があります。

+1

私は同様のことをして(ルートを追加して)、StAXを使って、有効なXML文書であることを期待していたものを解析しました – Yaneeve

0

これは私のC#バージョンです。それはいくつかの方向を与えることを願っています... 私はtcp/ip通信のためにそれを使用しています、 とTはいくつかの一般的なタイプを表します。

public List<T> ParseMultipleDocumentsByType<T>(string documents) 
    { 
     var cleanParsedDocuments = new List<T>(); 
     var stringContainsDocuments = true; 
     while (stringContainsDocuments) 
     { 
      if(documents.Contains(typeof(T).Name)) 
      { 
       var startingPoint = documents.IndexOf("<?xml"); 
       var endingString = "</" +typeof(T).Name + ">"; 
       var endingPoing = documents.IndexOf(endingString) + endingString.Length; 
       var document = documents.Substring(startingPoint, endingPoing - startingPoint); 
       var singleDoc = (T)XmlDeserializeFromString(document, typeof(T)); 
       cleanParsedDocuments.Add(singleDoc); 
       documents = documents.Remove(startingPoint, endingPoing - startingPoint); 
      } 
      else 
      { 
       flag = false; 
      } 
     } 


     return cleanParsedDocuments; 
    } 

    public static object XmlDeserializeFromString(string objectData, Type type) 
    { 
     var serializer = new XmlSerializer(type); 
     object result; 

     using (TextReader reader = new StringReader(objectData)) 
     { 
      result = serializer.Deserialize(reader); 
     } 

     return result; 
    } 
関連する問題