所以我有一个我在这里声明的xml文档:
DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder();
StringReader reader = new StringReader(s);
InputSource inputSource = new InputSource(reader);
doc_ = dBuilder.parse(inputSource);
Run Code Online (Sandbox Code Playgroud)
然后我有一个函数,我传入一个字符串,我想将它与我的xml中的元素匹配:
void foo(String str)
{
NodeList nodelist = doc_.getDocumentElement().getElementsByTagName(str);
}
Run Code Online (Sandbox Code Playgroud)
问题是,当它str进入它没有任何类型的命名空间,所以我将测试的xml将是:
<Random>
<tns:node />
</Random>
Run Code Online (Sandbox Code Playgroud)
并且str将是节点.因此nodelist现在为null,因为它期望tns:node但我传入了node.我知道忽略命名空间并不好,但在这种情况下它很好.我的问题是我不知道如何在忽略命名空间的同时在Node中搜索元素.我还想过将命名空间添加到str中,但我不知道如何做到这一点.
任何帮助将不胜感激,
谢谢,-Josh
我有一个1000条目文档,其格式类似于
<Example>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<Entry>
<n1></n1>
<n2></n2>
</Entry>
<!--and so on-->
Run Code Online (Sandbox Code Playgroud)
这里有超过1000个Entry节点.我正在编写一个Java程序,它基本上逐个获取所有节点并对每个节点进行一些分析.但问题是节点的检索时间随着它的增加而增加.例如,检索第一个节点100毫秒以检索第二个节点需要78毫秒,并且它继续增加.要检索999节点,需要5秒以上.这非常慢.我们将此代码插入到包含超过1000个条目的XML文件中.有些像数百万.解析整个文档的总时间超过5分钟.
我正在使用这个简单的代码来遍历它.这nxp是我自己的类,它具有从xpath获取节点的所有方法.
nxp.fromXpathToNode("/Example/Entry" + "[" + i + "]", doc);
Run Code Online (Sandbox Code Playgroud)
并且doc是该文件的文档.i是要检索的节点的否.
当我尝试这样的事情时
List<Node> nl = nxp.fromXpathToNodes("/Example/Entry",doc);
content = nl.get(i);
Run Code Online (Sandbox Code Playgroud)
我面临同样的问题.
任何人都有关于如何加速节点的tretirival的任何解决方案,因此从XML文件获取第一个节点以及1000个节点需要相同的时间.
谢谢
这是xpathtonode的代码.
public Node fromXpathToNode(String expression, Node context)
{
try
{
return (Node)this.getCachedExpression(expression).evaluate(context, XPathConstants.NODE);
}
catch (Exception cause)
{
throw new RuntimeException(cause);
}
}
Run Code Online (Sandbox Code Playgroud)
这是fromxpathtonodes的代码.
public List<Node> fromXpathToNodes(String expression, Node context)
{
List<Node> nodes = new ArrayList<Node>();
NodeList results = …Run Code Online (Sandbox Code Playgroud) 我原本想要一种优雅的方式来模拟IE或旧浏览器中函数Array.concat()结果的getElementsByTagName功能,因为它似乎concat不受支持.只是,当然它是 - 返回的对象不支持它的原因是因为它不是一个Array.哎呀!
getElementsByTagName实际上返回一个NodeList.那么真正的问题是:什么是获取文档中所有表单元素的单个列表(输入,选择,文本区域,按钮)以循环遍历它们的好方法?不需要数组......单个NodeList也是完美的.
请注意,我使用IE6,因为这是企业内部网(尽管IE8很快).
我想出的答案是:
它变得更简单,并且可能更好地将代码放入一个单独的函数并使用不同的节点列表调用它三次,而不是担心将它们组合成一个的好方法.
我最终转而使用MooTools(几个小时后阅读所有不同框架的比较).所以现在,获取我想要的项目数组非常简单.我建议使用这样的javascript框架,而不是人们试图找出最好的做事方式.当然我都是为了实际学习原始语言(这就是为什么我暂时停止使用框架),但它并不总是最快速的方式,这在业务中通常很重要通过语言提高编码人员的能力.
更新:差不多2年后我会使用jQuery并完成它!
您是否看到以下任何问题:
NodeList.prototype.forEach = Array.prototype.forEach;
Run Code Online (Sandbox Code Playgroud)
通常forEach只是数组的属性,但是通过将其设置为所有NodeLists 的属性,在将NodeList循环遍历其节点之前,不需要将a转换为数组forEach.
document.getElementsByTagName('div')和document.querySelectorAll('div')都返回NodeList集合.唯一的区别是第一种方法返回实时收集,第二种方法返回静态收集.
问题是 - 是否有机会仅通过检查这些对象来区分一个对象(即 - 不试图添加/删除一些项目来测试"活跃度")?
提前致谢
在提供关于问题属性的错误答案之后,我检查了元素的返回并找到了一种方法..item()Node.childNodes__proto__childNodesformforEach
所述forEach的方法Node.childNodes中没有的说明书中记载NodeList,在Methods以MDN,或接口节点列表,并没有出现在被提及迭代使用的forEach方法的节点列表或链接到该问题页; 虽然它出现在Chromium 50中.
该方法仅适用于相对较新版本的Chrome/Chromium吗?如果是,是否记录在案?
有没有关于forEach()方法的文件Node.childNodes?
document.querySelector("form").addEventListener("submit", function(e) {
e.preventDefault();
var form = e.target;
form.childNodes.forEach(function(el) {
if (el.tagName === "INPUT" && el.type !== "submit")
snippet.log("name:" + el.name + ", value:" + el.value)
});
});Run Code Online (Sandbox Code Playgroud)
<form>
<input type="text" name="firstName" value="The first name">
<input type="text" name="lastName" value="The last name">
<input type="email" name="emailAddress" value="email@example.com">
<br>
<input type="submit" …Run Code Online (Sandbox Code Playgroud)我试过我的谷歌,但我似乎找不到任何好的答案.请帮忙.
编辑:好的,所以我找到了这篇博文.所以它们来自不同的DOM级别,但除此之外它并没有多说......
为什么不getElementsByName,getElementsByTagName并且getElementsByClassName返回HTMLCollection(W3C,MDN)而不是NodeList(W3C,MDN)?
这三个都只返回一个只有元素的实时NodeList:
document.getElementsByName('nameAttrVal');
document.getElementsByTagName('div');
document.getElementsByClassName('space separated classes');
Run Code Online (Sandbox Code Playgroud)
NodeLists很棒,但是HTMLCollection更具体,因为它们只能包含HTML元素.看起来这对于那些方法来说是完美的.
创建集合时,过滤器和根与集合相关联.
例如,当创建document.images属性的HTMLCollection对象时,它与仅选择img元素并以文档根目录为根的过滤器关联.
然后,该集合表示以集合根为根的子树的实时视图,仅包含与给定过滤器匹配的节点.视图是线性的.在没有相反的特定要求的情况下,集合中的节点必须按树顺序排序.
- 关于收藏的W3C
HTMLCollection已经使用了几个地方:
document.images
element.children
Run Code Online (Sandbox Code Playgroud)
NB: querySelectorAll返回非现场直播NodeList.
这是其中一个看起来如此简单,但我无法想出一个很好的方法来解决它.
我有一个节点,也许nodelist = document.getElementById("mydiv");- 我需要将其规范化为节点列表.而不是一个数组:一个真实的,真正的nodeList对象.
不 nodelist = [document.getElementById("mydiv")];
请不要图书馆.
我正在动态生成内容,所以我经常最终会documentFragments查询我在documentFragment中使用querySelectorAll或querySelector返回nodeList的元素.
我不时会在列表中添加一个项目,但我无法在网上找到关于这是否可行的任何内容.
我试过这样的:
document.querySelectorAll(".translate").item(length+1) = document.createElement("div");
Run Code Online (Sandbox Code Playgroud)
还有这个:
document.querySelectorAll(".translate").shift(document.createElement("div"));
Run Code Online (Sandbox Code Playgroud)
但两者都不起作用(如预期的那样)
问题:
是否可以手动将元素添加到NodeList?我猜,不过还是要问.
感谢您的一些见解?
编辑:
更多信息:我正在生成一个动态内容块,我想附加到我的页面.默认情况下,该块为英文.由于用户正在用中文查看页面,我正在动态片段上运行翻译器,然后将其附加到DOM.在我的页面上,我还有一个元素,比如一个标题,它应该根据添加的动态内容而改变.我的想法是一步到位=尝试添加一个元素到我的nodeList.但是现在写它...我想不可能:-)
nodelist ×10
javascript ×7
dom ×5
arrays ×2
java ×2
nodes ×2
append ×1
chromium ×1
collections ×1
concat ×1
foreach ×1
html ×1
performance ×1
xml ×1
xpath ×1