【问题标题】:Invalid XMLDoc - There are multiple root elements. Line 9, position 2无效的 XMLDoc - 有多个根元素。第 9 行,位置 2
【发布时间】:2015-04-16 16:31:16
【问题描述】:

我正在调用一个返回 xml 的 Web 服务。当我需要在 json 中包含该 xml 以供以后使用时。我可以使用 Web 服务的其他方法来做到这一点。但是当调用 web 服务的特定方法并尝试解析它时,我得到以下错误:

“有多个根元素。第 9 行,位置 2”。

我收到的 xml 肯定有多个根元素,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Server>
   <Name>Abc</Name>
   <URL>www.abc.com</URL>
   <Env>Windows</Env>
</Server>
<Server>
   <Name>XYZ</Name>
   <URL>www.xyz.com</URL>
   <Env>Linux-Ubuntu</Env>
</Server>

所以基本上当我这样做时:

XmlDocument doc = new XmlDocument();
doc.LoadXml(response); // response contains the xml shown above
if (doc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
        doc.RemoveChild(doc.FirstChild); // Because I want to get rid of the declaration element in the xml.

var resXML = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.Indented, true); // To convert xml into json

return resXML; // Finally return the json.

调试的时候是 doc.LoadXml(response);在哪里抛出异常。

请记住,这是我从 web 服务而不是文件中获取的 xml。所以在这里使用 XDocument 是行不通的。

有什么建议、想法吗?

【问题讨论】:

  • 如果它有多个根级元素,那么它就不是 XML 文档。您需要与供应商交谈并要求他们最终解决问题。
  • 是的,我已经和他们谈过了,他们告诉我至少需要两周时间才能修复它。所以我不得不想出一个解决方法。

标签: xml json exception


【解决方案1】:

嗯,我自己解决了。但是,当然,我从另一个论坛得到了很少的帮助来了解如何做到这一点。 所以场景实际上是这样的:

我从第三方 API 获取 xml 作为响应(当然我对此没有任何控制权)。所以我想将响应封装在一个名为&lt;Servers&gt;&lt;/Servers&gt; 的根元素中,以便它成为有效的xml,然后我可以使用XmlDocument 或XDocument 进行解析。

为了解决这个问题,我使用以下逻辑将其封装在根元素中。

XmlReaderSettings xrs = new XmlReaderSettings();
        xrs.ConformanceLevel = ConformanceLevel.Fragment; //We confrom to the fragments because the document will not pass validation due to multiple root elements problem
        String xmlString = "<Servers>\n";
        using (XmlReader xr = XmlReader.Create(new StringReader(response), xrs))
        {
            while (xr.Read())
            {
                if (xr.NodeType != XmlNodeType.XmlDeclaration)
                {
                    switch (xr.NodeType)
                    {
                        case XmlNodeType.Element: // If nodetype is an element.
                            xmlString += "<" + xr.Name + ">";
                            break;
                        case XmlNodeType.Text: //Get text inside each element.
                            xmlString += xr.Value;
                            break;
                        case XmlNodeType.EndElement: //Close the element.
                            xmlString += "</" + xr.Name + ">";
                            break;
                    }
                }
            }
        }
        xmlString += "</Servers>"; //xmlString now has a string which is a valid xml. So XDocument or XmlDocument parse will not fail over it.

        var doc = XDocument.Parse(xmlString);
        var json = JsonConvert.SerializeXNode(doc,Newtonsoft.Json.Formatting.Indented, true);
        return json; // I convert it to json so the client can consume it.

完成!

当然,这是一种解决方法,但由于 API 人员需要时间才能修复无效的 xml,所以我不得不这样做直到那时。

【讨论】:

    【解决方案2】:

    在 xml 中应该有一个 &lt;Servers&gt; 标记,您可以在其中放置 &lt;Server&gt; 元素。

    <?xml version="1.0" encoding="UTF-8"?>
    <Servers>
    <Server>
       <Name>Abc</Name>
       <URL>www.abc.com</URL>
       <Env>Windows</Env>
    </Server>
    <Server>
       <Name>XYZ</Name>
       <URL>www.xyz.com</URL>
       <Env>Linux-Ubuntu</Env>
    </Server>
    </Servers>
    

    【讨论】:

    • 如何插入该标签??
    • 它应该从一开始就在 xml 中,并且 web 服务负责在我的选项中发送正确的 xml 文档。如果您是 web 服务的所有者,这里是如何从线程中的 xml 源执行此操作。 stackoverflow.com/questions/12048586/…
    • 不,这就是问题所在。 Web 服务是第三方服务,我无法控制它。链接中建议的解决方案中的问题是,我必须先加载 xml(doc.Load(xmlFilePath)),然后才能对其进行任何操作。但这就是引发异常的地方。
    • 抱歉,周末来了 :) 那我真的帮不了你。我认为您应该首先联系负责服务的人员,并确保他们的 xml 结果是正确的。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2018-03-30
    • 2013-07-21
    相关资源
    最近更新 更多