我使用XPather Browser在HTML页面上检查我的XPATH表达式.
我的最终目标是在Selenium中使用这些表达式来测试我的用户界面.
我有一个HTML文件,其内容与此类似:
<tr> <td>abc</td> <td> </td> </tr>
我想选择一个包含字符串" " 的文本的节点.
使用像"abc"这样的普通字符串是没有问题的.我使用类似的XPATH //td[text()="abc"].
当我尝试使用XPATH时,//td[text()=" "]它什么都不返回.是否有关于" &"的文本的特殊规则?
我和一些同事正在比较我们编写的过去的语言,并且正在讨论我们使用VBScript的经验,其奇怪的功能,如基于1的索引而不是基于0的索引,就像几乎所有其他语言一样,原因是它是一个用户语言(例如Excel VBA)而不是开发人员的语言.
然后有人说," XPath也有基于1的索引 ",直到我发现这篇文章中有许多理由支持基于0的方法,其中包括Michael Kay本人的一些,我无法相信:
但随后Michael Kay被引用作为结论:
......基于1的逻辑是XPath和XSLT的正确选择...因为该语言是为用户而不是为程序员设计的,而且用户仍然有这种老式的习惯,即将书中的第一章称为章节一...
有人可以向我解释一下吗? (1)XPath如何为用户设计?我无法想象任何不是开发人员与XPath的语法刚性或XSLT的声明/功能编程方面争论的人.和(2)为什么确实的XPath的创造者违背现代编程语言的规范,通过选择基于1指数?
有一个类似的问题,但似乎解决方案在我的情况下没有用:XDocument,XPath和命名空间的怪异
这是我正在使用的XML:
<?xml version="1.0" encoding="utf-8"?>
<Report Id="ID1" Type="Demo Report" Created="2011-01-01T01:01:01+11:00" Culture="en" xmlns="http://demo.com/2011/demo-schema">
<ReportInfo>
<Name>Demo Report</Name>
<CreatedBy>Unit Test</CreatedBy>
</ReportInfo>
</Report>
Run Code Online (Sandbox Code Playgroud)
以下是我认为它应该工作的代码,但它没有......
XDocument xdoc = XDocument.Load(@"C:\SampleXML.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(new NameTable());
xnm.AddNamespace(String.Empty, "http://demo.com/2011/demo-schema");
Console.WriteLine(xdoc.XPathSelectElement("/Report/ReportInfo/Name", xnm) == null);
Run Code Online (Sandbox Code Playgroud)
有没有人有任何想法?谢谢.
假设我有以下XML:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
Run Code Online (Sandbox Code Playgroud)
我想做一个xpath,它可以获取所有具有标题节点且语言属性为"it"的书节点.
我的尝试看起来像这样:
//book[title[@lang='it']]
但那没用.我希望得到回节点:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year> …Run Code Online (Sandbox Code Playgroud) 只看我的XML字段,我的行看起来像这样:
<person><firstName>Jon</firstName><lastName>Johnson</lastName></person>
<person><firstName>Kathy</firstName><lastName>Carter</lastName></person>
<person><firstName>Bob</firstName><lastName>Burns</lastName></person>
Run Code Online (Sandbox Code Playgroud)
请注意,这些是我表中的三行.
我想将SQL结果作为表返回
Jon | Johnson
Kathy| Carter
Bob | Burns
Run Code Online (Sandbox Code Playgroud)
什么查询将完成此任务?
在XSLT中有
<xsl:value-of select="expression"/>
Run Code Online (Sandbox Code Playgroud)
获取元素的值,但是有什么东西可以选择元素的标记名吗?
在这种情况下:
<person>
<!-- required stuff -->
<name>Robert</name>
<!-- optional stuff, free form for future extension.
Using XMLSchema's xsd:any -->
<profession>programmer</profession>
<hobby>photography</hobby>
</person>
<xsl:for-each select="person">
<xsl:tag-of select="."/> : <xsl:value-of select="."/>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
要获得这样的输出:
Run Code Online (Sandbox Code Playgroud)name : Robert profession : programmer hobby : photography
当然上面的XSLT不会编译因为
<xsl:tag-of select="expression"/>
Run Code Online (Sandbox Code Playgroud)
不存在.但是怎么办呢?
给定以下XML,如何编写XPath查询以拉出属性所在的节点foo?:
<node1>
<node2>
<node3 foo='bar'></node3>
<node3></node3>
<node3 bar='foo'></node3>
<node3 foo='foobar'></node3>
</node2>
</node1>
Run Code Online (Sandbox Code Playgroud) 我的目标是使用XPath从具有多个名称空间的多个xml文件中提取某些节点.只要我知道名称空间URI,一切正常.命名空间名称本身保持不变,但模式(XSD)有时是客户端生成的,即我不知道.然后我基本上有三种选择:
只使用一个模式用于命名空间,希望没有出错(我能确定吗?)
获取文档的子节点并查找带有命名空间URI的第一个节点,希望它在那里并只使用URI,希望它是正确的.可能由于多种原因而出错
不知何故告诉xpath:"看,我不关心命名空间,只需找到具有此名称的所有节点,我甚至可以告诉您命名空间的名称,而不是URI".这就是问题......
这不是许多"我的xpath表达不起作用的重复,因为我不知道命名空间感知" 这里或这里发现的问题.我知道如何使用命名空间感知.只是没有如何摆脱它.
在Xpath中,我想要选择等于特定值的元素.
示例XML数据:
<aaa id="11" >
<aaa id="21" >
<aaa id="31" ></aaa>
<bbb id="32" >
<aaa id="41" ></aaa>
<bbb id="42" ></bbb>
<ccc id="43" ></ccc>
<ddd id="44" >qwerty</ddd>
<ddd id="45" ></ddd>
<ddd id="46" ></ddd>
</bbb>
</aaa>
<bbb id="22" >
<aaa id="33" >qwerty</aaa>
<bbb id="34" ></bbb>
<ccc id="35" ></ccc>
<ddd id="36" ></ddd>
<ddd id="37" ></ddd>
<ddd id="38" ></ddd>
</bbb>
<ccc id="23" >qwerty</ccc>
<ccc id="24" ></ccc>
</aaa>
Run Code Online (Sandbox Code Playgroud)
现在,使用XPath:
//ccc[.='qwerty']
Run Code Online (Sandbox Code Playgroud)
我得到了正确的预期结果:
Name Value
ccc qwerty
Run Code Online (Sandbox Code Playgroud)
现在,使用XPath:
//aaa[.='qwerty']
Run Code Online (Sandbox Code Playgroud)
我得到了意外的结果:
Name Value
aaa …Run Code Online (Sandbox Code Playgroud) xpath ×10
xml ×7
selenium ×2
xslt ×2
.net ×1
c# ×1
indexing ×1
linq-to-xml ×1
namespaces ×1
parent ×1
search ×1
select ×1
sql-server ×1