XML错误:有多个根元素

我从Web服务获取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(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; } } } } 

我相信这个错误是在第二个父元素上抛出的。 我怎样才能避免这个错误? 任何帮助是极大的赞赏。

因为XML文档只能有一个根节点,所以需要将您的<parent>元素包含在周围的元素中:

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

当你从别的地方接收到这个标记时,你可能不得不自己创build标记,而是将其作为一个string处理,然后用适当的标签对其进行包装,然后再尝试将其parsing为XML。

所以,你有几个select:

  1. 获取Web服务的提供者返回具有一个根节点的实际 XML
  2. 如上所述,预处理XML以添加根节点
  3. 预处理XML以将其分成多个块(即,每个<parent>节点一个),并将每个块作为不同的XML文档进行处理

您可以在不修改XMLstream的情况下执行此操作:告诉XmlReader不要太挑剔。 将XmlReaderSettings.ConformanceLevel设置为ConformanceLevel.Fragment将使parsing器忽略没有根节点的事实。

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

现在你可以parsing这样的东西(这是一个实时的XMLstream,不可能用一个节点来包装)。

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

将xml包装在另一个元素中

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

如果你负责(或者对Web服务有任何控制),让他们添加一个独特的根元素!

如果你根本不能改变这个,那么你可以做一些正则expression式或者string分割来parsing每个元素,并将每个元素传递给你的XML Reader。

或者,您可以手动添加垃圾根元素,方法是在开始标记前添加一个结束标记。