0
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
    <meta name="Generator"/>
  </head>
  <body>
    <h1>My head 1</h1>
  </body>
</html>

以上是我的 XElement 对象的 .ToString html。看起来挺好的。

我正在尝试获取正文的 innerXml,但我的 XPath 返回 null。

XElement html = GettheHTMLAsXElementCorrectly()
var whyIsThisNull =  html.XPathSelectElement("/html/body");
4

2 回答 2

3

每当使用名称空间(在您的情况下<html>)时,您需要在搜索节点时定义名称空间:

使用 LINQ to XML
(我认为更简单、更清洁的解决方案)

// Create a XNamespace instance for the default namespace
XNamespace xhtml = "http://www.w3.org/1999/xhtml";

// Select the node using LINQ to XML
var bodyByLinq = doc.Element(xhtml + "html").Element(xhtml + "body");

使用 XPath

// Create a namespace manager
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable());

// Define your default namespace including a prefix to be used later in the XPath expression
namespaceManager.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");

// Select the node using XPath
var bodyByXPath = doc.XPathSelectElement("/xhtml:html/xhtml:body", namespaceManager);

更新:改进了我的答案,因为提供的示例不正确

于 2012-08-13T22:57:51.310 回答
0

@zombiehunter 是正确的,所以我给了他信任。

我也尝试过这种方式,我只是告诉 XPath 是忽略名称空间。似乎也有效。

var notNullAnyMore =  html.XPathSelectElement("//*[local-name() = 'body']" );
于 2012-08-13T23:09:17.400 回答