2011-03-01 60 views
0

有一个随机字符串,如何从中提取XML文档?Java - 从字符串中提取XML文档

请考虑该字符串可能不包含任何(不完整),一个(完整)或多个文档。

是否有解决此问题的模板/工具?

LE:考虑当XML数据通过TCP/IP

回答

1

检索到的我知道没有现成的解决方案,可自动处理破损的XML文档的情况下。在解析错误时,XML是一个非常严格的标准,它具有很小的余地。你只能靠自己。

您可以尝试的是查看XML编辑器的代码;他们必须能够处理腐败的文件,但我怀疑他们中的任何人都可以处理诸如缺少启动元素等事情。

2

多个文档是一个挑战......我想换行字符串转换成额外的“根”,这将至少在内容转换为有效的XML文档:

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

只是一个开始。当然,忘记xml架构和文档类型。不同的字符编码可能是一个挑战,您可能需要过滤掉<?xml ... ?>处理指令。

+1

我已经做了类似的事情(添加一个额外的根),然后使用StAX来解析我所希望的是一个有效的XML文档 – Yaneeve 2011-03-01 13:20:53

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; 
    }