Comportamento strano XmlDocument.LoadXML e GetElementByID, come dichiarare una stringa con virgolette
-
05-07-2019 - |
Domanda
Ecco un po 'di codice 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");
e divElement è uguale a null e non so perché
Ho anche provato a dichiarare WebPageStr in questo modo
string webPage = @"<html><body><div id="content">good content</div><div id="badcontent">bad content</div></body></html>";
ma XmlDocument genera un'eccezione System.Xml.XmlException: " & amp; " token errato
Cosa c'è che non va in questo codice?
Soluzione
È necessario includere una dichiarazione DOCTYPE se si desidera utilizzare Metodo GetElementById . È perché la funzione non sa cosa significa ID per l'XML specificato. Nel tuo caso stai usando XHTML, quindi devi specificare che quando vuoi trovare un elemento con id questo significa trovare un nodo che ha un attributo chiamato " 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");
Questo primo approccio implica che è necessario l'accesso Web alla dichiarazione DOCTYPE quando si esegue il codice ( http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd )
Un approccio alternativo sarebbe usare l'espressione 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\"]");