Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML错误:存在多个根元素_C#_Xml - Fatal编程技术网

C# XML错误:存在多个根元素

C# XML错误:存在多个根元素,c#,xml,C#,Xml,我正在从web服务获取XML。以下是XML的外观: <parent> <child> Text </child> </parent> <parent> <child> <grandchild> Text </grandchild> <grandchild>

我正在从web服务获取XML。以下是XML的外观:

<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之前,通过将响应视为字符串并使用适当的标记将其包装来完成此操作

因此,您有两个选择:

  • 让web服务的提供者返回具有一个根节点的实际XML
  • 如上所述,预处理XML以添加根节点
  • 预处理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>