喜欢.//div[@id='foo\d+]
用div捕获div标签的东西id='foo123'
.
我正在使用.NET,如果这很重要的话.
我无法理解之间的差异text()
和node()
.根据我的理解,在这种情况下text()
,标签之间的任何东西<item>apple</item>
都是苹果.节点将是节点实际上的任何节点,这将是项目
但后来我被分配了一些工作,它要求我"选择生产中所有项目的文本",另一个问题是"选择所有部门中的所有经理节点"
输出如何看起来text()
与之相反node()
XML片段:
<produce>
<item>apple</item>
<item>banana</item>
<item>pepper</item>
</produce>
<department>
<phone>123-456-7891</phone>
<manager>John</manager>
</department>
Run Code Online (Sandbox Code Playgroud)
当然,有更多的部门和更多的经理,但这只是一小段代码.
任何帮助将非常感激!
我正在寻找一个XPath评估器,它不会重建整个DOM文档来查找文档的节点:实际上该对象是使用SAX模型管理大量XML数据(理想情况下超过2Gb),这非常有利于内存管理,并提供搜索节点的可能性.
谢谢大家的支持!
对于所有那些说不可能的人:我最近在问到这个问题后,发现了一个名为"saxpath"的项目(http://www.saxpath.org/),但我找不到任何实施项目.
我必须解析一个如下所示的XML文档:
<?xml version="1.0" encoding="UTF-8" ?>
<m:OASISReport xmlns:m="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd">
<m:MessagePayload>
<m:RTO>
<m:name>CAISO</m:name>
<m:REPORT_ITEM>
<m:REPORT_HEADER>
<m:SYSTEM>OASIS</m:SYSTEM>
<m:TZ>PPT</m:TZ>
<m:REPORT>AS_RESULTS</m:REPORT>
<m:MKT_TYPE>HASP</m:MKT_TYPE>
<m:UOM>MW</m:UOM>
<m:INTERVAL>ENDING</m:INTERVAL>
<m:SEC_PER_INTERVAL>3600</m:SEC_PER_INTERVAL>
</m:REPORT_HEADER>
<m:REPORT_DATA>
<m:DATA_ITEM>NS_PROC_MW</m:DATA_ITEM>
<m:RESOURCE_NAME>AS_SP26_EXP</m:RESOURCE_NAME>
<m:OPR_DATE>2010-11-17</m:OPR_DATE>
<m:INTERVAL_NUM>1</m:INTERVAL_NUM>
<m:VALUE>0</m:VALUE>
</m:REPORT_DATA>
Run Code Online (Sandbox Code Playgroud)
问题是名称空间"http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"有时可能会有所不同.我想完全忽略它,只是从标记MessagePayload下游获取我的数据.
我到目前为止使用的代码是:
String[] namespaces = new String[1];
String[] namespaceAliases = new String[1];
namespaceAliases[0] = "ns0";
namespaces[0] = "http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd";
File inputFile = new File(inputFileName);
Map namespaceURIs = new HashMap();
// This query will return all of the ASR records.
String xPathExpression = "/ns0:OASISReport
/ns0:MessagePayload
/ns0:RTO
/ns0:REPORT_ITEM
/ns0:REPORT_DATA";
xPathExpression += "|/ns0:OASISReport
/ns0:MessagePayload …
Run Code Online (Sandbox Code Playgroud) 如何通过给定org.w3c.dom.document上的xpath字符串快速定位元素/元素?似乎没有FindElementsByXpath()
方法.例如
/html/body/p/div[3]/a
Run Code Online (Sandbox Code Playgroud)
我发现,当存在大量同名元素时,递归迭代所有子节点级别会非常慢.有什么建议?
我不能使用任何解析器或库,只能使用w3c dom文件.
注意:如果您遇到此问题,请在Apache JIRA上进行投票:
我得出了一个令人惊讶的结论:
Element e = (Element) document.getElementsByTagName("SomeElementName").item(0);
String result = ((Element) e).getTextContent();
Run Code Online (Sandbox Code Playgroud)
似乎是比这快100倍的令人难以置信的:
// Accounts for 30%, can be cached
XPathFactory factory = XPathFactory.newInstance();
// Negligible
XPath xpath = factory.newXPath();
// Negligible
XPathExpression expression = xpath.compile("//SomeElementName");
// Accounts for 70%
String result = (String) expression.evaluate(document, XPathConstants.STRING);
Run Code Online (Sandbox Code Playgroud)
我正在使用JVM的JAXP默认实现:
org.apache.xpath.jaxp.XPathFactoryImpl
org.apache.xpath.jaxp.XPathImpl
Run Code Online (Sandbox Code Playgroud)
我真的很困惑,因为很容易看出JAXP如何优化上面的XPath查询来实际执行一个简单的getElementsByTagName()
.但它似乎并没有这样做.此问题仅限于大约5-6个经常使用的XPath调用,这些调用由API抽象和隐藏.这些查询涉及/a/b/c
仅针对始终可用的DOM文档的简单路径(例如,无变量,条件).因此,如果可以进行优化,则很容易实现.
我的问题:XPath的缓慢是一个公认的事实,还是我忽略了什么?是否有更好(更快)的实施?或者我应该完全避免XPath,简单查询?
我真的不明白XPath函数name
和local-name
.
你能举例说明他们会有所不同吗?
鉴于这个例子:
<?xml version="1.0" ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head></head>
</html>
Run Code Online (Sandbox Code Playgroud)
我对这两个查询得到了相同的结果://*[local-name()="head"]
和//*[name()="head"]
.这是为什么?
我试图用Selenium(版本2.28.0)搜索子元素中的元素,但selenium des似乎没有将其搜索限制为子元素.我这样做错了还是有办法使用element.find来搜索子元素?
举个例子,我用这段代码创建了一个简单的测试网页:
<!DOCTYPE html>
<html>
<body>
<div class=div title=div1>
<h1>My First Heading</h1>
<p class='test'>My first paragraph.</p>
</div>
<div class=div title=div2>
<h1>My Second Heading</h1>
<p class='test'>My second paragraph.</p>
</div>
<div class=div title=div3>
<h1>My Third Heading</h1>
<p class='test'>My third paragraph.</p>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我的python(2.6版)代码如下所示:
from selenium import webdriver
driver = webdriver.Firefox()
# Open the test page with this instance of Firefox
# element2 gets the second division as a web element
element2 = driver.find_element_by_xpath("//div[@title='div2']")
# Search second division for a paragraph …
Run Code Online (Sandbox Code Playgroud) xpath ×10
xml ×5
java ×3
dom ×2
.net ×1
apache ×1
expression ×1
javascript ×1
jaxp ×1
namespaces ×1
performance ×1
python ×1
regex ×1
sax ×1
selenium ×1