Странное поведение XmlDocument.LoadXML и GetElementByID, как удалить строку с кавычкой - PullRequest
2 голосов
/ 07 марта 2009

Вот какой-то код c #

string webPageStr =  @"<html><body><div id=""content"">good content</div><div id=""badcontent"">bad content</div></body></html>";
XmlDocument webPage = new XmlDocument();
webPage.LoadXml(webPageStr);

 XmlElement divElement = webPage.GetElementById("content");

и divElement равно нулю, и я не знаю, почему

Я также пытался объявить webPageStr таким образом

string webPage =  @"<html><body><div id=&quot;content&quot;>good content</div><div id=&quot;badcontent&quot;>bad content</div></body></html>";

но XmlDocument вызывает исключение System.Xml.XmlException: "&" bad token

Что не так с этим кодом?

1 Ответ

3 голосов
/ 07 марта 2009

Вам необходимо включить объявление DOCTYPE, если вы хотите использовать метод GetElementById . Это потому, что функция не знает, что означает идентификатор для данного XML. В вашем случае вы используете XHTML, поэтому вам нужно указать, что когда вы хотите найти элемент по id, это означает, что нужно найти узел, имеющий атрибут с именем "id":

string webPageStr = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""><html><body><div id=""content"">good content</div><div id=""badcontent"">bad content</div></body></html>";
XmlDocument webPage = new XmlDocument();
webPage.LoadXml(webPageStr);
XmlElement divElement = webPage.GetElementById("content");

Этот первый подход означает, что вам нужен веб-доступ к объявлению DOCTYPE при запуске вашего кода (http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd)

Альтернативным подходом было бы использование выражения XPATH:

string webPageStr = @"<html><body><div id=""content"">good content</div><div id=""badcontent"">bad content</div></body></html>";
XmlDocument webPage = new XmlDocument();
webPage.LoadXml(webPageStr);
XmlNode divElement = webPage.SelectSingleNode("//div[@id=\"content\"]");
...