XmlDocument игнорировать xmlns - PullRequest
       11

XmlDocument игнорировать xmlns

4 голосов
/ 27 января 2012

У меня есть файл XHTML, который начинается с:

<html xmlns="http://www.w3.org/1999/xhtml">

Я загружаю его:

XmlDocument xml = new XmlDocument();
StringReader sr = new StringReader(html);
XmlTextReader xmltr = new XmlTextReader(sr);
xmltr.Namespaces = false;
xml.Load(xmltr);

Когда я звоню xml.InnerXml, я всегда получаю исключение The 'xmlns' attribute is bound to the reserved namespace 'http://www.w3.org/2000/xmlns/'. и не могудоступ к внутреннему XML моего XmlDocument.Как избавиться от xmlns при загрузке?

РЕШЕНИЕ ЕСТЬ:

XmlNode xmln = xml.SelectSingleNode("//html");
if (xmln != null)
    ((XmlElement)xmln).RemoveAttribute("xmlns");

1 Ответ

3 голосов
/ 27 января 2012

Предположительно, страница, которую вы пытаетесь проанализировать, недавно изменилась на XHTML, отсюда и пространства имен?

Согласно @JonSkeet, вам не следует устанавливать xmltr.Namespaces = false; на вашем XmlTextReader

Вы можете либо

  • охватывает пространства имен и использует XmlNameSpaceManager для управления пространством имен XHTML (xmlns="http://www.w3.org/1999/xhtml").
  • использовать независимое от пространства имен xpath, например local-name(), которое будет игнорировать пространство имен: *

 xml.SelectSingleNode("/*[local-name()='html']/*[local-name()='body']")

В любом случае, ваш код должен будет измениться, чтобы адаптироваться к пространствам имен, если только вы не взломаете пространство имен из XML перед его загрузкой.

* Вы также можете использовать // с local-name(), но будьте осторожны с документами с большим количеством элементов - это может стать очень медленным.

...