2009-03-07 3 views
2

Вот некоторые C# кодСтранное поведение XmlDocument.LoadXML и GetElementByID, как delcare строку кавычки

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 равен нулю, и я не знаю, почему

Я также попытался DECLARE 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: "&" плохой маркер

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

ответ

3

Вам необходимо включить объявление DOCTYPE, если вы хотите использовать метод GetElementById. Это связано с тем, что функция не знает, что означает идентификатор для данного XML. В вашем случае, если вы используете XHTML, поэтому вам нужно указать, что если вы хотите, чтобы найти элемент по идентификатору это означает найти узел, который имеет атрибут с именем «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\"]"); 
+0

Спасибо, что он работает :) – ksopyla

+0

+1. Имя атрибута «id» не является чем-то особенным для документа XML, если схема не указала иначе. («Xml: id» может быть, но это не атрибут HTML [X] ...) – bobince

+1

Если вы используете апострофы вместо кавычек, чтобы разграничить строковые литералы XPath, вам не придется их избегать. –