2011-02-18 137 views
39

我從Web服務獲取XML。這裏是XML的樣子:XML錯誤:有多個根元素

<parent> 
    <child> 
     Text 
    </child> 
</parent> 
<parent> 
    <child> 
     <grandchild> 
      Text 
     </grandchild> 
     <grandchild> 
      Text 
     </grandchild> 
    </child> 
    <child> 
     Text 
    </child> 
</parent> 

etc. 

這裏是我的C#代碼:

StringBuilder output = new StringBuilder(); 

// Create an XmlReader 
using (XmlReader reader = XmlReader.Create(new StringReader([email protected]))) 
{ 
    XmlWriterSettings ws = new XmlWriterSettings(); 
    //ws.Indent = true; 
    using (XmlWriter writer = XmlWriter.Create(output, ws)) 
    { 
     // Parse the file and display each of the nodes. 
     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: 
        writer.WriteStartElement(reader.Name); 
        break; 
       case XmlNodeType.Text: 
        writer.WriteString(reader.Value); 
        break; 
       case XmlNodeType.XmlDeclaration: 
       case XmlNodeType.ProcessingInstruction: 
        writer.WriteProcessingInstruction(reader.Name, reader.Value); 
        break; 
       case XmlNodeType.Comment: 
        writer.WriteComment(reader.Value); 
        break; 
       case XmlNodeType.EndElement: 
        writer.WriteFullEndElement(); 
        break; 
      } 
     } 
    } 
} 

我認爲錯誤是第二父元素拋出。我怎樣才能避免這個錯誤?任何幫助是極大的讚賞。

+4

嗯,首先,你從Web服務獲得的東西*不是* XML,因爲它有兩個根元素,這是什麼導致你的問題。你如何從Web服務中獲得它?你是否在某種程度上不小心修剪了真正的根部元素? – 2011-02-18 15:10:41

+0

@Matt - 不,我從Web服務逐字返回響應。 – divided 2011-02-18 15:20:21

回答

49

您需要括在周圍的元素你<parent>元素作爲XML文檔只能有一個根節點:

<parents> <!-- I've added this tag --> 
    <parent> 
     <child> 
      Text 
     </child> 
    </parent> 
    <parent> 
     <child> 
      <grandchild> 
       Text 
      </grandchild> 
      <grandchild> 
       Text 
      </grandchild> 
     </child> 
     <child> 
      Text 
     </child> 
    </parent> 
<parents> <!-- I've added this tag --> 

正如你從別的地方接收到這個標記,而不是生成它自己,你可能不得不通過將響應視爲字符串並用適當的標籤包裝它,然後嘗試將其解析爲XML。

所以,你已經有幾條路:

  1. 獲取網絡服務的提供者返回你實際 XML有一個根節點
  2. 預先處理XML,因爲我「VE上面所建議的,要添加根節點
  3. 預處理的XML將其分割成多個塊(即,一個用於每個<parent>節點)和過程中的每個作爲不同的XML文檔
9

裹在另一個元素的XML

<wrapper> 
<parent> 
    <child> 
     Text 
    </child> 
</parent> 
<parent> 
    <child> 
     <grandchild> 
      Text 
     </grandchild> 
     <grandchild> 
      Text 
     </grandchild> 
    </child> 
    <child> 
     Text 
    </child> 
</parent> 
</wrapper> 
6

如果你負責(或通過網絡進行服務的任何控制),讓他們增添獨一無二的根元素!

如果你根本不能改變它,那麼你可以做一些正則表達式或字符串分割來解析每一個元素,並將每個元素傳遞給你的XML Reader。

或者,您可以手動添加垃圾根元素,方法是在開始標記前添加一個結束標記並加後綴。

63

您可以在不修改XML流的情況下執行此操作:告訴XmlReader不要太挑剔。 將XmlReaderSettings.ConformanceLevel設置爲ConformanceLevel.Fragment將使解析器忽略沒有根節點的事實。

 XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.ConformanceLevel = ConformanceLevel.Fragment; 
     using (XmlReader reader = XmlReader.Create(tr,settings)) 
     { 
      ... 
     } 

現在,您可以解析類似這樣的內容(這是一個實時XML流,無法用節點包裝)。

<event> 
    <timeStamp>1354902435238</timeStamp> 
    <eventId>7073822</eventId> 
</event> 
<data> 
    <time>1354902435341</time> 
    <payload type='80'>7d1300786a0000000bf9458b0518000000000000000000000000000000000c0c030306001b</payload> 
</data> 
<data> 
    <time>1354902435345</time> 
    <payload type='80'>fd1260780912ff3028fea5ffc0387d640fa550f40fbdf7afffe001fff8200fff00f0bf0e000042201421100224ff40312300111400004f000000e0c0fbd1e0000f10e0fccc2ff0000f0fe00f00f0eed00f11e10d010021420401</payload> 
</data> 
<data> 
    <time>1354902435347</time> 
    <payload type='80'>fd126078ad11fc4015fefdf5b042ff1010223500000000000000003007ff00f20e0f01000e0000dc0f01000f000000000000004f000000f104ff001000210f000013010000c6da000000680ffa807800200000000d00c0f0</payload> 
</data> 
相關問題