尝试读取XML文档(C#)时出错?

时间:2015-01-27 19:17:42

标签: c# .net xml web-services google-maps

我有以下XML,我正在尝试"加载"到XmlDocument对象:Link to XML File

我有以下方法代码来加载XML文档:

public XmlDocument getDirections()
    {
        XmlTextReader xmlReader;
        XmlDocument xmlResponse = new XmlDocument();
        StringBuilder xmlResponseString = new StringBuilder();
        xmlReader = new XmlTextReader(getRequestURL()); //getRequestURL gives the URL for XML doucument

        while (xmlReader.Read())
        {
            if (xmlReader.NodeType == XmlNodeType.Element)
            {
                xmlResponseString.Append(xmlReader.ReadInnerXml());
            }
        }
        xmlResponse.LoadXml(xmlResponseString.ToString());
        return xmlResponse;
     }

当我运行代码时,出现以下错误:

An unhandled exception of type 'System.Xml.XmlException' occurred in System.Xml.dll

Additional information: There are multiple root elements. Line 3, position 3.

我认为这是因为XML文档有多个route对象,但我不知道如何修复它。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

它所说的行:

Additional information: There are multiple root elements. Line 3, position 3.

这是你的线索。

格式正确的XML将有1个根元素。

实施例

<root>
   <child>
     <subchild>.....</subchild>
   </child>
</root>

有关进一步说明,请参阅:http://www.w3schools.com/xml/xml_syntax.asp

答案 1 :(得分:1)

这样做有什么意义?使用内置功能从Url获​​取Xml:

var str = @"https://maps.googleapis.com/maps/api/directions/xml?origin=Jamaica,%20NY%2011418&destination=Hunter%20College%20Park%20Avenue%20New%20York&mode=&alternatives=true&key=AIzaSyB8G9omVUu6a_OQCrRM-QItdwk-Hxq__mg";

var doc = new XmlDocument();
doc.Load(str);

//or
var xdoc = XDocument.Load(str);

我会通过XDocument调查Linq到Xml(XmlDocument)。使用起来要容易得多。

答案 2 :(得分:0)

您可以使用以下代码段来加载xml。

public XmlDocument getDirections()
    {
        XmlTextReader xmlReader;
        XmlDocument xmlResponse = new XmlDocument();
        StringBuilder xmlResponseString = new StringBuilder();
        HttpWebRequest request =HttpWebRequest.Create(getRequestURL());

        using(HttpWebResponse response = (HttpWebResponse) request.GetResponse())
        {
            if (response.StatusCode == HttpStatusCode.OK)
            {
                using (var responseStream = response.GetResponseStream())
                {
                    xmlResponse.Load(responseStream);
                }
            }
        }            
        xmlResponse.LoadXml(xmlResponseString.ToString());
        return xmlResponse;
    }

答案 3 :(得分:0)

我在尝试使用XmlReader读取Xml时遇到了类似的事件。

我的代码:

using (XmlReader reader = XmlReader.Create(new StringReader(filesContent)))
{
    while (reader.Read())     //<--- This is where the exception was caught
    {
        // Do stuff here
    }
}

遇到异常:

  

发生了'System.Xml.XmlException'类型的未处理异常   system.xml.dll的

     

其他信息:有多个根元素。 X行,   位置Y。

注意:有关异常中提供的行和位置的位置的信息不是实际行或xml文件内容中我的附加根所在的位置,这使得这有点误导。< / em>

格式正确的xml文件应仅包含一个根。就这样:

<?xml version="1.0" encoding="UTF-8" ?> 
<root1>
   <child1>
     <subchild1>.....</subchild1>
   </child1>
</root1>

在我的情况下,异常被抛出,因为我的xml文件包含2个根

<?xml version="1.0" encoding="UTF-8" ?>
<root1>
   <child1>
     <subchild1>.....</subchild1>
   </child1>
</root1>
<root2>
   <child1>
     <subchild1>.....</subchild1>
     <subchild2>.....</subchild2>
   </child1>
   <child2>
     <subchild1>.....</subchild1>
   </child2>
</root2>

可以通过在文件中添加一些'parentroot'来轻松修复,使2个根嵌套在新的父根下

<?xml version="1.0" encoding="UTF-8" ?>
<parnetroot>    
    <root1>
       <child>
         <subchild>.....</subchild>
       </child>
    </root1>
    <root2>
       <child1>
         <subchild1>.....</subchild1>
         <subchild2>.....</subchild2>
       </child1>
       <child2>
         <subchild1>.....</subchild1>
       </child2>
    </root2>
</parnetroot>