Пытаетесь разобрать xml, но xmldocument.loadxml () пытается загрузить? - PullRequest
2 голосов
/ 18 марта 2010

У меня есть строковый ввод, который я не знаю, является ли действительным xml.

Я думаю, что самый простой подход - завернуть

new XmlDocument().LoadXml(strINPUT);

В попытке / поймать.

Проблема, с которой я сталкиваюсь, иногда strINPUT является HTML-файлом, если заголовок этого файла содержит

<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">
<html xml:lang=""en-GB"" xmlns=""http://www.w3.org/1999/xhtml"" lang=""en-GB"">

... как и многие другие, он на самом деле пытается установить соединение с URL-адресом w3.org, чего я действительно не хочу.

Кто-нибудь знает, возможно ли просто проанализировать строку, не пытаясь быть умным и проверяя внешние URL-адреса? В противном случае есть альтернатива xmldocument?

Ответы [ 3 ]

6 голосов
/ 18 марта 2010

Попробуйте следующее:

XmlDocument doc = new XmlDocument();
using (var reader = XmlReader.Create(new StringReader(xml), new XmlReaderSettings() {
    ProhibitDtd = true,
    ValidationType = ValidationType.None
})) {
    doc.Load(reader);
}

Код создает считыватель, который отключает обработку и проверку DTD. Проверка на корректность будет по-прежнему применяться.

В качестве альтернативы вы можете использовать XDocument.Parse, если вы можете переключиться на использование XDocument вместо XmlDocument.

2 голосов
/ 18 марта 2010

Я не уверен в причинах проблемы, но Вы пробовали XDocument и XElement классов в System.Xml.Linq

 XDocument document = XDocument.Load(strINPUT , LoadOptions.None);
 XElement element = XElement.Load(strINPUT );

РЕДАКТИРОВАТЬ: для XML как string попробуйте следующий

XDocument document = XDocument.Parse(strINPUT , LoadOptions.None );
1 голос
/ 18 марта 2010

Используйте метод загрузки XmlDocument, чтобы загрузить документ XML, используйте XmlNodeList, чтобы получить элементы, а затем получить данные ... попробуйте следующее:

XmlDocument xmlDoc = new XmlDocument();
//use the load method to load the XML document from the specified stream.
xmlDoc.Load("myXMLDoc.xml");
//Use the method GetElementsByTagName() to get elements that match the specified name.
XmlNodeList item = xDoc.GetElementsByTagName("item");
XmlNodeList url = xDoc.GetElementsByTagName("url"); 
Console.WriteLine("The item is: " + item[0].InnerText));

добавьте блок try / catch вокруг приведенного выше кода и посмотрите, что вы ловите, измените свой код в соответствии с этой ситуацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...