C# XML错误:存在多个根元素
我正在从web服务获取XML。以下是XML的外观:C# XML错误:存在多个根元素,c#,xml,C#,Xml,我正在从web服务获取XML。以下是XML的外观: <parent> <child> Text </child> </parent> <parent> <child> <grandchild> Text </grandchild> <grandchild>
<parent>
<child>
Text
</child>
</parent>
<parent>
<child>
<grandchild>
Text
</grandchild>
<grandchild>
Text
</grandchild>
</child>
<child>
Text
</child>
</parent>
etc.
我相信这个错误是在第二个父元素上抛出的。如何避免这个错误?非常感谢您的帮助。您需要将
元素包含在周围的元素中,因为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之前,通过将响应视为字符串并使用适当的标记将其包装来完成此操作
因此,您有两个选择:
节点一个块),并将每个块作为一个不同的XML文档进行处理将xml包装到另一个元素中
<wrapper>
<parent>
<child>
Text
</child>
</parent>
<parent>
<child>
<grandchild>
Text
</grandchild>
<grandchild>
Text
</grandchild>
</child>
<child>
Text
</child>
</parent>
</wrapper>
正文
正文
正文
正文
如果您负责(或控制web服务),请让他们添加唯一的根元素
如果您根本无法改变这一点,那么可以执行一些正则表达式或字符串拆分来解析每个元素,并将每个元素传递给XML阅读器
或者,您可以手动添加垃圾根元素,方法是在开始标记前面加前缀,在结束标记后面加后缀。您可以在不修改XML流的情况下添加垃圾根元素:告诉XmlReader不要太挑剔。 将
XmlReaderSettings.ConformanceLevel
设置为ConformanceLevel.Fragment
将允许解析器忽略没有根节点的事实
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (XmlReader reader = XmlReader.Create(tr,settings))
{
...
}
现在您可以解析这样的内容(这是一个实时XML流,不可能用节点包装)
1354902435238
7073822
1354902435341
7D1300786A0000000BF9458B05180000000000000000000000000000000C0C0C0030306001B
1354902435345
FD1260780912FF3028FEA5FFC0387D640FA550F40FBDF7AFFF001FFF8200FFF00F0BF0E000042201421100224FF40312300111400004F00000F00000E0C0FBD1E0000F10E0FCCC2FF000F00F00F00EED01002140401
1354902435347
FD126078AD11FC4015FEFDF5B042FF1010223500000000003007FF00F20E0F010000000DC0F01000F000000000000004F000000F104FF001000210F000013010000C6DA000000680FFA807800200000000D00C0F0
首先,您从web服务获得的东西不是XML,因为它有两个根元素,这正是导致问题的原因。您是如何从web服务获得它的?你是不是无意中删掉了真正的根元素?@Matt-不,我是从web服务逐字返回响应。在这种情况下,我要告诉服务提供商,拥有一个看起来非常像XML但实际上不是XML的文档格式一点都不有趣:)我想知道它是否只是被破坏了,或者如果他们故意这么做有什么奇怪的原因?@Matt-说得好,我会向他们提出。也许这是一个排除任何不值得使用web服务的用户的测试?:)它是“XML”,但不是XML文档。您仍然可以解析它,只需要放松XmlReader。看看下面我的答案。@ RB如果每个父元素上都有DOCTYPE元素,那么考虑我的问题,Java是不是java,但是我认为逻辑是一样的。有一种方法可以在不修改XML流的情况下完成它。下面我的答案应该是
,“它不是XML文档”声称:这是观点和观点的问题。输入是一系列有效的XML片段。我用了这个答案,这个很有效。我不得不解析几个GB的.svclog文件,并用根标记包装整个内容以获得正确的“XML”,这不是一个选项。
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (XmlReader reader = XmlReader.Create(tr,settings))
{
...
}
<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>