无法使用 xpath 在 xhtml 文档中找到 <input> 元素

Can't find <input> element in xhtml document using xpath

提问人:Relax 提问时间:10/25/2018 最后编辑:Relax 更新时间:10/25/2018 访问量:261

问:

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

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

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

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

向我返回第一个具有特殊类和特殊标题属性的节点,无论它是什么元素。这工作得很好!

但是在一种情况下,我需要获取具有特殊名称属性的特定元素类型“input”。我已经尝试了几种不同的XPATH,但是经过一些Google研究之后,这应该可以做到。但事实并非如此,我公司里的一些人,包括我,都不知道为什么根据定义它应该起作用......

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

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

<?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);

DefaultNameSpace在 XmlDocument 中现在是我猜应该是正确的。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);
C# XML XPath XHTML

评论

0赞 chrisis 10/25/2018
元素输入位于 xhtml 命名空间中。因此,要么声明命名空间,要么对元素进行通配符,例如 //*:input
0赞 Relax 10/25/2018
System.Xml.XPath.XPathException: “'//*:input[@name='A07']' is a invalid Token.” 和 //*/input 再次导致 null
0赞 Mr Lister 10/25/2018
看起来你是在尝试嵌套引号,对吗?'
0赞 Relax 10/25/2018
那个引号只是由异常错误添加,代码本身是 //*:input[@name='A07'] 由 chrisis 提供。您可以在上面的代码中看到查询本身
0赞 chrisis 10/25/2018
请参阅在 C# 中使用具有默认命名空间的 Xpath 并将 xhtml 命名空间设置为默认命名空间。

答: 暂无答案