Error XML: hay múltiples elementos raíz

Obtengo XML de un servicio web. Así es como se ve el XML:

  Text      Text   Text    Text   etc. 

Y aquí está mi código de 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; } } } } 

Creo que el error se produce en el segundo elemento principal. ¿Cómo puedo evitar este error? Cualquier ayuda es muy apreciada.

Debe encerrar sus elementos en un elemento circundante, ya que los documentos XML solo pueden tener un nodo raíz:

     Text      Text   Text    Text     

Como está recibiendo este marcado de otra parte, en lugar de generarlo usted mismo, puede tener que hacer esto usted mismo tratando la respuesta como una cadena y envolviéndola con las tags apropiadas, antes de intentar analizarla como XML.

Entonces, tienes un par de opciones:

  1. Obtenga el proveedor del servicio web para que le devuelva el XML real que tiene un nodo raíz
  2. Preprocesa el XML, como he sugerido anteriormente, para agregar un nodo raíz
  3. Preprocesa el XML para dividirlo en varios fragmentos (es decir, uno para cada nodo ) y procesar cada uno como un documento XML distinto

Puede hacerlo sin modificar la secuencia XML: indique al XmlReader que no sea tan quisquilloso. Establecer el XmlReaderSettings.ConformanceLevel en ConformanceLevel.Fragment permitirá que el analizador ignore el hecho de que no hay un nodo raíz.

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

Ahora puede analizar algo como esto (que es una secuencia XML en tiempo real, donde es imposible envolver con un nodo).

  1354902435238 7073822    7d1300786a0000000bf9458b0518000000000000000000000000000000000c0c030306001b    fd1260780912ff3028fea5ffc0387d640fa550f40fbdf7afffe001fff8200fff00f0bf0e000042201421100224ff40312300111400004f000000e0c0fbd1e0000f10e0fccc2ff0000f0fe00f00f0eed00f11e10d010021420401    fd126078ad11fc4015fefdf5b042ff1010223500000000000000003007ff00f20e0f01000e0000dc0f01000f000000000000004f000000f104ff001000210f000013010000c6da000000680ffa807800200000000d00c0f0  

Ajustar el xml en otro elemento

    Text      Text   Text    Text    

Si está a cargo (o tiene control sobre el servicio web), ¡haga que agreguen un elemento raíz único!

Si no puede cambiar eso en absoluto, puede hacer un poco de expresiones regulares o de división de cadenas para analizar cada una y pasar cada elemento a su lector de XML.

De forma alternativa, puede agregar manualmente un elemento raíz no deseado, prefijando una etiqueta de apertura y añadiendo el sufijo a una etiqueta de cierre.