Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NamedNodeMap的泛型foreach迭代_Java_Xml_Iteration_Generics_W3c - Fatal编程技术网

Java NamedNodeMap的泛型foreach迭代

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())

在Java中,查看接口,如何使用泛型对其进行迭代?它似乎使用节点而不是字符串,但我不太确定如何使用节点对象

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++);
        }
    };
}