Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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 DOM解析器读取Xml,检索属性值并存储它们_Java_Xml Parsing_Hashmap_Domparser_Xml Attribute - Fatal编程技术网

Java DOM解析器读取Xml,检索属性值并存储它们

Java DOM解析器读取Xml,检索属性值并存储它们,java,xml-parsing,hashmap,domparser,xml-attribute,Java,Xml Parsing,Hashmap,Domparser,Xml Attribute,使用DOM解析器,我将属性值存储在Java中的HashMap中,然后根据需要检索它。有没有其他不用地图的方法 Xml示例: <?xml version="1.0" encoding="UTF-8"?> <Main> <SubMainLevels> <SubMainLevel LineNo="1" arg2="122" RollNo="11" weight="14" folds="1" /> <SubMainLev

使用DOM解析器,我将属性值存储在Java中的HashMap中,然后根据需要检索它。有没有其他不用地图的方法

Xml示例:

<?xml version="1.0" encoding="UTF-8"?>
<Main>
   <SubMainLevels>
      <SubMainLevel LineNo="1" arg2="122" RollNo="11" weight="14" folds="1" />
      <SubMainLevel LineNo="2" arg2="123" RollNo="12" weight="12" folds="2" />
   </SubMainLevels>
</Main>

我所做的:

   Map<String, String> x = new HashMap<String, String>(); 
   getXmlAttr(){
    Traverse till Main\SubMainLevels\SubMainLevel       

     for each SubMainLevel {    
      getAttribute() for all attributes  LineNo,arg2,RollNo,weight,folds 
      concatenate strConcat = arg2+":"+RollNo+":"+weight+":"+folds
      x.put(LineNo,strConcat);
     }
    }




 retrieveAttrMap(HashMap x){
    for each HashMap key{
      strVal =x.get(key)
      split strVal at ":"
      //do stuff
    }  
 }
Map x=newhashmap();
getXmlAttr(){
遍历到主\子主层级\子主层级
对于每个子主级{
getAttribute()用于所有属性LineNo、arg2、RollNo、weight、folds
连接strConcat=arg2+“:“+RollNo+”:“+weight+”:“+folds
x、 put(线路号、strConcat);
}
}
retrieveAttrMap(HashMap x){
对于每个HashMap键{
strVal=x.get(键)
拆分字符串位于“:”
//做事
}  
}

您可以使用
POJO
类来存储属性,而不仅仅是使用字符串

此程序使用
BeanUtils
将属性填充到bean中

这是密码

import java.io.FileInputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.commons.beanutils.BeanUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

public class DOMParsarDemo2 {
    protected DocumentBuilder docBuilder;
    protected Element root;

    private static List<SubMainLevel> subMainLevels = new ArrayList<SubMainLevel>();

    public DOMParsarDemo2() throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        docBuilder = dbf.newDocumentBuilder();
    }

    public void parse(String file) throws Exception {
        Document doc = docBuilder.parse(new FileInputStream(file));
        root = doc.getDocumentElement();
        System.out.println("root element is :" + root.getNodeName());
    }

    public void printAllElements() throws Exception {
        printElement(root);
    }

    public void printElement(Node node) {
        if (node.getNodeType() != Node.TEXT_NODE) {
            Node child = node.getFirstChild();
            while (child != null) {
                if ("SubMainLevel".equals(child.getNodeName())) {
                    NamedNodeMap namedNodeMap = child.getAttributes();

                    Map<String, String> attrMap = new HashMap<String, String>();
                    for (int i = 0; i < namedNodeMap.getLength(); i++) {
                        Node n = namedNodeMap.item(i);
                        attrMap.put(n.getNodeName(), n.getNodeValue());
                    }

                    SubMainLevel subMainLevel = new SubMainLevel();
                    try {
                        BeanUtils.populate(subMainLevel, attrMap);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                    subMainLevels.add(subMainLevel);
                }
                printElement(child);
                child = child.getNextSibling();
            }
        }
    }

    public static void main(String args[]) throws Exception {
        DOMParsarDemo2 demo = new DOMParsarDemo2();
        demo.parse("resources/abc1.xml");
        demo.printAllElements();

        for (SubMainLevel subMainLevel : subMainLevels) {
            System.out.println(subMainLevel);
        }
    }
}

使用
Map
有什么危害?您可以使用
POJO
类来存储属性,而不是使用字符串。在这种情况下,您不需要在每次检索属性值时拆分字符串。@正如您所说的“您可以使用POJO类来存储属性,而不是使用字符串。在这种情况下,您不需要在每次检索属性值时拆分字符串”我正在获取输入xml,将其转换为
DOM文档(inpDoc)
然后调用
getXmlValues
,在这里我创建
PojoClass
类的对象并传递所有属性。然后我将此对象存储在带有“LineNo”的hashmap中作为关键。您的建议是什么?在其他链接中发布代码片段,因为它在此处的注释中失去了格式是的,您是对的,这是正确的方式,但是您在问题中提到的约束如何?是否有其他方法不使用映射来执行此操作。@Braj我想避免映射,因为我必须拆分值稍后。我按照您的建议使用了POJO,并在您的解决方案中显示了这一点。因此我同意。如果您有其他方法可以实现这一点,请分享您的想法。否则这就足够了。[我对java不熟悉,因此仍在探索做事的方法。]继续使用这种方法,欢迎来到java世界。:)您所建议的一切似乎都很好,但它将为所有
子主层
提供输出。但是,如果我只想重设一个perticualr
子主层
,而不是全部,该怎么办呢?这里发生的事情是,POJO类临时存储值,一旦进入下一个
子主层
,它将获得一组新的值。我需要的是永久存储它,并根据需要使用它。问题-我只想重新给出一个有针对性的子级答案-它非常简单。您可以在
if(“SubMainLevel”.equals(child.getNodeName()){…}
下放置一些条件。Question-POJO类临时存储值,一旦进入下一个子层,它就会获得一组新的值。回答-不,它永远不会为下一个子级别获得新状态。所有这些都存储在单独的POJO中,最后添加到一个列表中。问题-我需要的是永久存储它并根据需要使用。回答-所有POJO都存储在
列表子主层中
。您可以根据需要使用它。问题-我只想重新保存一个有针对性的subMainLevel答案-您可以在将其添加到列表
subMainLevels.add(subMainLevel)之前验证
subMainLevel
import java.io.Serializable;    

public class SubMainLevel implements Serializable {

    private static final long serialVersionUID = 1L;

    public SubMainLevel() {

    }

    private String LineNo;
    private String arg2;
    private String RollNo;
    private String weight;
    private String folds;

    public String getLineNo() {
        return LineNo;
    }

    public void setLineNo(String lineNo) {
        LineNo = lineNo;
    }

    public String getArg2() {
        return arg2;
    }

    public void setArg2(String arg2) {
        this.arg2 = arg2;
    }

    public String getRollNo() {
        return RollNo;
    }

    public void setRollNo(String rollNo) {
        RollNo = rollNo;
    }

    public String getWeight() {
        return weight;
    }

    public void setWeight(String weight) {
        this.weight = weight;
    }

    public String getFolds() {
        return folds;
    }

    public void setFolds(String folds) {
        this.folds = folds;
    }

    @Override
    public String toString() {
        return "LineNo=" + getLineNo() + " arg2=" + getArg2() + " RollNo=" + getRollNo()
                + " weight=" + getWeight() + " folds=" + getFolds();
    }

}