使用xpath

时间:2018-10-25 07:18:10

标签: c# xml xpath xhtml

在xhtml文档中找到单个节点时遇到一些问题。 我正在XmlDocument中加载XHTML字符串,因为不允许使用HTML Agility Pack。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xhtmlContent);

在不同情况下,我需要搜索不同的节点。 例如

 selectedNode = xmlDoc.SelectSingleNode("//*[@class='" + classText + "'][@title='" + titleText + "']");

返回第一个具有特殊类和特殊标题属性的节点,无论它是什么元素。一切正常!

但是在一种情况下,我需要获得具有特殊名称Attribute的特定元素类型“ input”。我尝试了几种不同的XPATH,但是经过Google Research之后,应该可以这样做。但是事实并非如此,而且包括我在内的公司中的某些人员也不知道为什么它应该起作用...

selectedNode = xmlDoc.SelectSingleNode("//input[@name='" + nameText + "']");

我无法选择完整路径,因为<form>内部的xhtml结构可能不同。 这是XHTML文档的一部分:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>Online</title>
</head>

<body onload="javascript:setup();">

<form id="daten" action="{{{Intern_FORMACTION}}}" method="post">
	<div>
		<input name="Z0000" type="hidden" value="7" />
		<input name="xt" type="hidden" value="" />
		<input name="XE001" type="hidden" value="" />
		<input name="XE002" type="hidden" value="" />
		<input name="mv" type="hidden" value="1" />
		<div class="tabBar">
                  <div class="tabBarContent">
                     <div class="block8">&#160;</div>
                  </div>
	        </div>
        </div>
</form>
</body>
</html>

例如,我要获取此节点:<input name="XE001" type="hidden" value="" />

但是它总是返回null。

如果我运行此在XPATH Tester中,一切正常,我得到正确的input元素。只是在代码中不起作用。

任何想法都受到高度赞赏!

[更新#1]

试图将默认名称空间设置为xhtml元素

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("", xmlDoc.DocumentElement.NamespaceURI);
XmlDocument中的

DefaultNameSpace现在是http://www.w3.org/1999/xhtml,我猜应该是正确的。

但是所有这些测试仍然返回null。

xmlDoc.SelectSingleNode("//input[@name='" + nameText + "']", nsmgr);
xmlDoc.SelectSingleNode("//html/input[@name='" + nameText + "']", nsmgr);
xmlDoc.SelectSingleNode("/html/input[@name='" + nameText + "']", nsmgr);
xmlDoc.SelectSingleNode("//html:input[@name='" + nameText + "']", nsmgr);

0 个答案:

没有答案