2012-07-19 53 views
2

我有一個文本流,其中包含任意純文本和格式良好的xml元素的段。我如何讀取它並僅提取xml元素?將ConformLevel設置爲Fragment的XmlReader在遇到純文本時仍會引發異常,這對xml格式不正確。從混合XML和純文本的流中讀取

任何想法?由於

這裏是我到目前爲止的代碼:

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ConformanceLevel = ConformanceLevel.Fragment; 

using (XmlReader reader = XmlReader.Create(stream, settings)) 
    while (!reader.EOF) 
    { 
     reader.MoveToContent(); 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(reader.ReadSubtree()); 
     reader.ReadEndElement(); 
    } 

這裏有一個樣品流的內容和我的方式有沒有控制權:

Found two objects: 
Object a 
<object> 
    <name>a</name> 
    <description></description> 
</object> 
Object b 
<object> 
    <name>b</name> 
    <description></description> 
</object> 
+3

這不是XML,如果你有純文本。不要試圖將它解析爲Xml。你能更準確地描述源的格式嗎?也許HtmlAgilityPack可以幫助你,它可以解析Html,它是節點和純文本的混合體。 – 2012-07-19 07:06:40

+0

我知道這不是,否則這會容易得多!我已經添加了一個樣本流內容(不知道如何關閉顏色突出顯示在這裏..對不起) – veezi 2012-07-19 07:20:26

+0

對於語法突出顯示,您可以強制語言使用'<! - language:lang-html - > '(請參閱幫助更多信息)。你應該嘗試一下HtmlAgility包,關於你的源碼流。或者你有一個可靠的方法來知道純文本和什麼是XML(類似於知道模式:1個文本,1個XML節點,1個文本,1個XML節點,etC.) – 2012-07-19 07:31:33

回答

1

提供,這是一個黑客,如果你用「假」xml根節點包裝混合文檔,您應該能夠根據需要獲取根元素的子元素中只有類型元素的節點(即跳過文本節點):

using System; 
using System.Linq; 
using System.Xml; 

static class Program { 

    static void Main(string[] args) { 

     string mixed = @" 
Found two objects: 
Object a 
<object> 
    <name>a</name> 
    <description></description> 
</object> 
Object b 
<object> 
    <name>b</name> 
    <description></description> 
</object> 
"; 
     string xml = "<FOO>" + mixed + "</FOO>"; 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xml); 
     var xmlFragments = from XmlNode node in doc.FirstChild.ChildNodes 
          where node.NodeType == XmlNodeType.Element 
          select node; 
     foreach (var fragment in xmlFragments) { 
      Console.WriteLine(fragment.OuterXml); 
     } 

    } 

} 
+0

太棒了!奇蹟般有效。非常感謝你。 – veezi 2012-07-19 13:18:15

+0

很高興幫助,即使我不能承認,它不會爆炸稍有不同的投入:) – 2012-07-19 14:38:40