XPath:从C#中的XElement中选择一个子节点

时间:2012-08-13 22:54:50

标签: c# linq xpath

<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对象{.1}}的.ToString。看起来不错。

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

html

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

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

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

var notNullAnyMore =  html.XPathSelectElement("//*[local-name() = 'body']" );