2015-01-27 3 views
-1

У меня есть следующий XML, что я пытаюсь «нагрузки» в XmlDocument объект: Link to XML FileОшибка при попытке прочитать XML-документ (C#)?

У меня есть метод следующий фрагмент кода для загрузки документа 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 объектов, но я не знаю, как это исправить. Любая помощь будет оценена!

+2

Пожалуйста, ваше содержания XML –

+4

Это кажется как довольно запутанный способ анализа XML. Что случилось с 'XmlDocument.Load (url)'? Или в идеале, используя LINQ to XML ... –

ответ

1

Какой смысл делать это таким образом? Используйте встроенную функциональность для получения Xml из URL:

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); 

Я хотел бы посмотреть в Linq к Xml (XDocument) над XmlDocument. С этим работать намного проще.

+0

Этот метод работает ... но мне любопытно, почему мой исходный код не работает? –

+0

, возможно, кто-то мог бы ответить на это, если бы вы опубликовали то, что выглядит в вашем существующем xml .. вы даже прочитали сообщение об ошибке .. мы не можем ответить, что, не видя, что ваш xml не публикует ссылки, отредактируйте исходный вопрос и опубликуйте xml в вашем редакторе – MethodMan

+0

ваш метод удаляет корневой узел, что делает xml недействительным, с одной стороны, – Jonesopolis

2

линия, где он говорит:

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

Это ваш ключ.

Правильно отформатированный XML будет иметь 1 корневой элемент.

Ex.

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

См для дальнейшего объяснения: http://www.w3schools.com/xml/xml_syntax.asp

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; 
    } 
0

Я столкнулся с подобным инцидентом при попытке прочитать Xml с помощью XmlReader.

Мой код:

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

Исключение поймал:

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

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

Примечание: Информация о местонахождении линии и положения, которые были предоставлены в исключение не фактическая линия или позиция в содержимом файла xml, где был мой дополнительный корень, что делает это немного вводить в заблуждение.

Правильно отформатированный 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> 
Смежные вопросы