XML错误:有多个根元素

div*_*ded 45 c# xml

我从Web服务获取XML.这是XML的样子:

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

etc.
Run Code Online (Sandbox Code Playgroud)

这是我的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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ata 76

你可以在不修改XML流的情况下完成它:告诉XmlReader不要那么挑剔.设置XmlReaderSettings.ConformanceLevelConformanceLevel.Fragment将让解析器忽略没有根节点的事实.

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ConformanceLevel = ConformanceLevel.Fragment;
        using (XmlReader reader = XmlReader.Create(tr,settings))
        {
             ...
        }
Run Code Online (Sandbox Code Playgroud)

现在你可以解析这样的东西(这是一个实时的XML流,不可能用节点包装).

<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>
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 54

您需要将<parent>元素包含在周围元素中,因为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 -->
Run Code Online (Sandbox Code Playgroud)

当你从其他地方收到这个标记时,你不必自己生成它,你可能必须自己做这个,把它作为一个字符串处理并用适当的标记包装它,然后再尝试将它解析为XML.

所以,你有几个选择:

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

  • 有一种方法可以在不修改XML流的情况下完成.请参阅下面的答案 (5认同)
  • 最后应为&lt;/ parents&gt; (2认同)

Ben*_*nCr 9

将xml包装在另一个元素中

<wrapper>
<parent>
    <child>
        Text
    </child>
</parent>
<parent>
    <child>
        <grandchild>
            Text
        </grandchild>
        <grandchild>
            Text
        </grandchild>
    </child>
    <child>
        Text
    </child>
</parent>
</wrapper>
Run Code Online (Sandbox Code Playgroud)


Sam*_*rth 6

如果您负责(或对Web服务有任何控制权),请让他们添加一个唯一的根元素!

如果你根本无法改变它,那么你可以做一些正则表达式或字符串拆分来解析每个元素并将每个元素传递给XML Reader.

或者,您可以手动添加垃圾根元素,前缀为开始标记并为结束标记添加后缀.