什么是XPath(在C#API中XDocument.XPathSelectElements(xpath,nsman),如果重要的话)查询此文档中的所有MyNode?
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<MyNode xmlns="lcmp" attr="true">
<subnode />
</MyNode>
</configuration>
Run Code Online (Sandbox Code Playgroud)
/configuration/MyNode这是错误的,因为它忽略了命名空间./configuration/lcmp:MyNode哪个是错的,因为lcmp是URI,而不是前缀./configuration/{lcmp}MyNode哪个失败了因为Additional information: '/configuration/{lcmp}MyNode' has an invalid token.编辑:我不能mgr.AddNamespace("df", "lcmp");像一些回答者所建议的那样使用.这要求XML解析程序知道我计划提前使用的所有命名空间.由于这适用于任何源文件,我不知道手动添加前缀的命名空间.它似乎{my uri}是XPath语法,但微软并没有打算实现那个......是真的吗?
为什么这个Xpath无法使用XDocument.XPathSelectElement?
Xpath的:
//Plugin/UI[1]/PluginPageCategory[1]/Page[1]/Group[1]/CommandRef[2]
Run Code Online (Sandbox Code Playgroud)
XML
<Plugin xmlns="http://www.MyNamespace.ca/MyPath">
<UI>
<PluginPageCategory>
<Page>
<Group>
<CommandRef>
<Images>
</Images>
</CommandRef>
<CommandRef>
<Images>
</Images>
</CommandRef>
</Group>
</Page>
</PluginPageCategory>
</UI>
</Plugin>
Run Code Online (Sandbox Code Playgroud)
C#代码:
myXDocument.XPathSelectElement("//Plugin/UI[1]/PluginPageCategory[1]/Page[1]/Group[1]/CommandRef[2]", myXDocument.Root.CreateNavigator());
Run Code Online (Sandbox Code Playgroud) 我试图在执行xpath查询后选择一组结果节点中的第一个元素.
当我这样做:
//dl
Run Code Online (Sandbox Code Playgroud)
我得到以下结果集:
[<dl>?…?</dl>?, <dl>?…?</dl>?]
Run Code Online (Sandbox Code Playgroud)
我如何获得第一个?这些都不起作用:
//dl[1]
//dl[position()=1]
Run Code Online (Sandbox Code Playgroud)
我正在Chrome的Web Inspector中执行此操作.
对于:
<foo>
<bar key="value">text</bar>
</foo>
Run Code Online (Sandbox Code Playgroud)
我如何获得"价值"?
xml.findtext("./bar[@key]")
Run Code Online (Sandbox Code Playgroud)
引发错误.
我在Android上编写Java以从XML文件中检索数据,但我遇到了问题.考虑这个XML:
<ITEM>
<REVENUE_YEAR>2554-02</REVENUE_YEAR>
<REGION>Central</REGION>
</ITEM>
<ITEM>
<REVENUE_YEAR>2552-02</REVENUE_YEAR>
<REGION>Central</REGION>
</ITEM>
<ITEM>
<REVENUE_YEAR>2552-03</REVENUE_YEAR>
<REGION>Central</REGION>
</ITEM>
Run Code Online (Sandbox Code Playgroud)
如何在2552年开始的年份中获得所有元素.我试过:
//REVENUE_YEAR[starts-with(.,'2552')]/text()
Run Code Online (Sandbox Code Playgroud)
它有效,但当我尝试时:
//REVENUE_YEAR[starts-with(.,'2552')]/REGION/text()
Run Code Online (Sandbox Code Playgroud)
它不起作用.
在XML文档中,我有共享相同名称的元素,但属性的值定义了它的数据类型,我想从文档中选择所有具有特定值的元素.我是否需要使用XPath(如果是这样,您能建议正确的语法)还是有更优雅的解决方案?
这是一些XML示例:
<object>
<data type="me">myname</data>
<data type="you">yourname</data>
<data type="me">myothername</data>
</object>
Run Code Online (Sandbox Code Playgroud)
我想选择所有类型的<data>孩子的内容.<object>me
PS - 我正在尝试使用PHP与Netflix API进行交互 - 这对我的问题无关紧要,但如果你想提出一个好的/更好的方法,我会全力以赴.
我在使用Selenium在网页中定位元素时使用了大量的XPath,并且最近已经从使用node1 // node2转向使用node1/descendant :: node2.这两种方法有什么区别?一个比另一个更有效吗?
用于演示的示例XML代码段:
<div id="books">
<table>
<tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr>
<tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr>
</table>
</div>
Run Code Online (Sandbox Code Playgroud)
所以它是:
id('books')//td[@class='title']
要么:
id('books')/descendant::td[@class='title'] 正在进行一些与向jsoup https://github.com/jhy/jsoup/pull/80添加xpath支持相关的工作.
我有一个XPath来选择我想要的类://div[@class='myclass'].但它返回给我整个div(<div class='myclass'>也有,但我想只返回这个标签的内容而没有标签本身.我怎么能这样做?
我刚安装IE10在我的Windows 7,而且我发现,即使我很高兴,从AJAX请求个XML现在可以兼容DOM文档,就像一个相当基本的功能document.evaluate是仍然不支持.
更糟糕的是,由于这些个XML是不是定制的微软IXMLDocument对象,节点不支持selectNodes和selectSingleNode了.最后,似乎IE10不支持DOM Level 3 XPath或MSXML Xpath.
说真的,微软?有什么我想念的吗?
当然,我可以使用querySelector和querySelectorAll,但我不想失去相当多的向后兼容性.
否则,仍然可以使用此行请求MSXML文档
try {xhr.responseType = "msxml-document";} catch(e) {}
Run Code Online (Sandbox Code Playgroud)
如规定在这里,但我认为这将是很好对付,最后,在IE标准DOM文档了.
那么,有没有办法在IE10中使用带有标准DOM文档的XPath?
更新2013年6月26日 IE11尚未稳定,但仍然不支持document.evaluate.如果它不支持它在稳定的版本,我怀疑它会永远支持它.毋庸置疑,这是荒谬的.
我知道你可以在DOM节点中使用querySelector/ All,但它在IE9及更低版本中不受支持,这仍然是非常常用的,无论如何XPath比选择器更强大.
幸运的是(如果可以这么说),你仍然可以设置xhr.responseType = "msxml-document".有那么一刻,我担心你再也不能那样做了......
更新23/11/2013 IE11现在稳定,但遗憾的是,它不支持document.evaluate.随着重量级XML文档在Web应用程序中越来越少地使用JSON或其他光表示法格式,这变得不那么成问题了,但仍然如此.
设置responseType属性仍然提供遗留的XML文档,所以我猜没有丢失.不过,我不知道IE12是否会成立.
更新15/8/2015现在听起来很荒谬,但Edge现在支持document.evaluate.就在(几乎)一切都切换到JSON进行数据交换时.嗯,迟到总比没有好,我想.
xpath ×10
xml ×4
c# ×2
dom3 ×1
elementtree ×1
html-parsing ×1
jsoup ×1
linq-to-xml ×1
msxml ×1
netflix ×1
parsing ×1
php ×1
python ×1
simplexml ×1
xmldom ×1