【问题标题】:Why does XmlDocument.GetElementById always return null?为什么 XmlDocument.GetElementById 总是返回 null?
【发布时间】:2011-04-16 02:28:31
【问题描述】:

我有一些如下所示的 XML(有效的 XHTML):

<html>
    <head>
        <script type="text/javascript">
            <![CDATA[
                function change_header(){
                    document.getElementById("myHeader").innerHTML="Nice day!";
                }]]>
        </script>
    </head>
    <body>
        <h1 id="myHeader">Hello World!</h1>
        <button onclick="change_header()">Change text</button>
    </body>
</html>

我正在尝试使用docment.GetElementById("myHeader") 获取#myHeader 节点,但它总是返回null。为什么?

我猜测它不能将id 属性识别为没有DTD 或其他东西的 id 属性?如果是这样,我怎样才能让它使用 HTML DTD?

【问题讨论】:

  • 同 [GetElementById() 没有找到标签? ](stackoverflow.com/questions/2003185/…)。
  • 马修,我觉得不一样。只需删除 Firefox 和 chrome 中的 CDATA 即可。
  • @Gonzalo:你完全误解了这个问题。看看标签。这与 JavaScript 无关。我正在尝试用 C# 解析 HTML。

标签: c# xmldocument sgmlreader


【解决方案1】:

这是因为 XmlDocument 对 id 的含义一无所知。您需要在 XHTML 文档中包含一个 DTD。只需将以下内容放在 html 文件的开头:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

例子:

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

请注意,这可能会慢一些,因为需要下载 DTD。

【讨论】:

  • 文档以流的形式来自网络。还有另一种设置文档类型的方法吗?
  • 恐怕您需要将其加载到内存中,附加正确的 DTD,然后将其加载到 XmlDocument 中。当然,如果您打算解析 HTML,我建议您使用 Html Agility Pack。使用 XmlDocument 解析无效网页(例如没有 DTD 的网页)是一项危险的任务。
  • 改用SgmlReader。不太喜欢 HtmlAgilityPack。
  • 我将此标记为已接受的答案以关闭此线程,但我去寻找“id”属性,因为它更容易。
猜你喜欢
  • 2015-03-12
  • 2014-09-12
  • 2019-09-18
  • 2014-09-02
  • 2015-02-27
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多