Erro XML: existem vários elementos raiz

Estou recebendo XML de um serviço da web. Aqui está o que o XML parece:

  Text      Text   Text    Text   etc. 

E aqui está o meu código c #:

 StringBuilder output = new StringBuilder(); // Create an XmlReader using (XmlReader reader = XmlReader.Create(new StringReader(xoResponse.@return))) { 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; } } } } 

Eu acredito que o erro é lançado no segundo elemento pai. Como posso evitar esse erro? Qualquer ajuda é muito apreciada.

É necessário include seus elementos em um elemento adjacente, pois os documentos XML podem ter apenas um nó raiz:

     Text      Text   Text    Text     

Como você está recebendo essa marcação de algum outro lugar, em vez de gerá-la por conta própria, talvez seja necessário fazer isso sozinho, tratando a resposta como uma string e envolvendo-a com tags apropriadas, antes de tentar analisá-la como XML.

Então, você tem algumas escolhas:

  1. Obtenha o provedor do serviço da web para retornar o XML real que possui um nó raiz
  2. Pré-processe o XML, como sugeri acima, para adicionar um nó raiz
  3. Pré-processe o XML para dividi-lo em vários fragments (ou seja, um para cada nó ) e processe cada um como um documento XML distinto

Você pode fazer isso sem modificar o stream XML: informe o XmlReader para não ser tão exigente. Definir o XmlReaderSettings.ConformanceLevel como ConformanceLevel.Fragment permitirá que o analisador ignore o fato de que não há um nó raiz.

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

Agora você pode analisar algo como isso (que é um stream XML em tempo real, em que é impossível envolvê-lo com um nó).

  1354902435238 7073822    7d1300786a0000000bf9458b0518000000000000000000000000000000000c0c030306001b    fd1260780912ff3028fea5ffc0387d640fa550f40fbdf7afffe001fff8200fff00f0bf0e000042201421100224ff40312300111400004f000000e0c0fbd1e0000f10e0fccc2ff0000f0fe00f00f0eed00f11e10d010021420401    fd126078ad11fc4015fefdf5b042ff1010223500000000000000003007ff00f20e0f01000e0000dc0f01000f000000000000004f000000f104ff001000210f000013010000c6da000000680ffa807800200000000d00c0f0  

Envolva o xml em outro elemento

    Text      Text   Text    Text    

Se você está no comando (ou tem algum controle sobre o serviço da web), faça com que eles adicionem um elemento raiz único!

Se você não pode mudar isso, então você pode fazer um pouco de regex ou divisão de string para analisar cada um e passar cada elemento para o seu XML Reader.

Como alternativa, você pode adicionar manualmente um elemento raiz de lixo eletrônico, prefixando uma tag de abertura e sufixando uma tag de fechamento.