Java NamedNodeMap的泛型foreach迭代
在Java中,查看接口,如何使用泛型对其进行迭代?它似乎使用节点而不是字符串,但我不太确定如何使用节点对象Java NamedNodeMap的泛型foreach迭代,java,xml,iteration,generics,w3c,Java,Xml,Iteration,Generics,W3c,在Java中,查看接口,如何使用泛型对其进行迭代?它似乎使用节点而不是字符串,但我不太确定如何使用节点对象 NamedNodeMap namedNodeMap = doc.getAttributes(); Map<String, String> stringMap = (Map<String, String>) namedNodeMap; for (Map.Entry<String, String> entry : stringMap.entrySet())
NamedNodeMap namedNodeMap = doc.getAttributes();
Map<String, String> stringMap = (Map<String, String>) namedNodeMap;
for (Map.Entry<String, String> entry : stringMap.entrySet()) {
//key,value stuff here
}
NamedNodeMap NamedNodeMap=doc.getAttributes();
Map stringMap=(Map)namedNodeMap;
对于(Map.Entry:stringMap.entrySet()){
//关键,这里有价值的东西
}
是的,我知道如何在不使用泛型和常规for循环的情况下进行迭代,但我想使用上面的习惯用法?为了地图。当然,问题似乎是,尽管名称不同,NamedNodeMap实际上并没有实现Map接口!:(
我猜你得咬紧牙关,做点像这样的事:
/*
* Iterates through the node attribute map, else we need to specify specific
* attribute values to pull and they could be of an unknown type
*/
private void iterate(NamedNodeMap attributesList) {
for (int j = 0; j < attributesList.getLength(); j++) {
System.out.println("Attribute: "
+ attributesList.item(j).getNodeName() + " = "
+ attributesList.item(j).getNodeValue());
}
}
/*
*迭代节点属性映射,否则需要指定特定的
*要提取的属性值,它们可能是未知类型
*/
私有void iterate(NamedNodeMap属性列表){
对于(int j=0;j
没有比这更好的了吗?我认为没有更好的方法来使用这些API。(更新:OK-也许算是好的。) 请记住,W3C DOM Java API是在Java具有泛型或新的
for
语法,甚至迭代器
接口之前指定的。还请记住,W3C DOM API for Java实际上是将IDL规范映射到Java的结果
如果您想在内存中使用更好的API来处理XML等,也许应该看看JDOM。您可以为
NamedNodeMap
创建自己的Iterable
包装器,然后在foreach循环中使用它
例如,这可以是一个简单的实现:
public final class NamedNodeMapIterable implements Iterable<Node> {
private final NamedNodeMap namedNodeMap;
private NamedNodeMapIterable(NamedNodeMap namedNodeMap) {
this.namedNodeMap = namedNodeMap;
}
public static NamedNodeMapIterable of(NamedNodeMap namedNodeMap) {
return new NamedNodeMapIterable(namedNodeMap);
}
private class NamedNodeMapIterator implements Iterator<Node> {
private int nextIndex = 0;
@Override
public boolean hasNext() {
return (namedNodeMap.getLength() > nextIndex);
}
@Override
public Node next() {
Node item = namedNodeMap.item(nextIndex);
nextIndex = nextIndex + 1;
return item;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
@Override
public Iterator<Node> iterator() {
return new NamedNodeMapIterator();
}
}
使用类似的方法,您可以在Map.Entry
实例上创建Iterable
。由于您不能强制转换为,我建议使用经典for循环,如下所示:
int numAttrs = namedNodeMap.getLength();
System.out.println("Attributes:");
for (int i = 0; i < numAttrs; i++){
Attr attr = (Attr) pParameterNode.getAttributes().item(i);
String attrName = attr.getNodeName();
String attrValue = attr.getNodeValue();
System.out.println("\t[" + attrName + "]=" + attrValue);
}
int numAttrs=namedNodeMap.getLength();
System.out.println(“属性:”);
对于(int i=0;i
来自Java 8解决方案:
private static Iterable<Node> iterableNamedNodeMap(final NamedNodeMap namedNodeMap) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < namedNodeMap.getLength();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return namedNodeMap.item(index++);
}
};
}
私有静态iterableNamedNodeMap(最终名称NodeMap NamedNodeMap){
return()->new Iterator(){
私有整数指数=0;
@凌驾
公共布尔hasNext(){
返回索引
这不是很好吗?我的意思是它是每个属性节点上的一个循环!那些非标准名称应该在重要的库中被禁止。应该被称为NamedNodeList,没有人会感到困惑。当您必须使用DOM时,这(以及它的同级节点可编辑的
)是绝对的救命稻草。
private static Iterable<Node> iterableNamedNodeMap(final NamedNodeMap namedNodeMap) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < namedNodeMap.getLength();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return namedNodeMap.item(index++);
}
};
}