Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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 在JDOM中为子节点解析XML文件_Java_Xml_Xml Parsing_Jdom - Fatal编程技术网

Java 在JDOM中为子节点解析XML文件

Java 在JDOM中为子节点解析XML文件,java,xml,xml-parsing,jdom,Java,Xml,Xml Parsing,Jdom,我有以下方式的XML文件: <head> <username>bhnsub</username> <error>0</error> <account_id>633</account_id> <info> <mac>address_goes_here<mac

我有以下方式的XML文件:

<head>
                <username>bhnsub</username>
                <error>0</error>
                <account_id>633</account_id>

        <info>
        <mac>address_goes_here<mac>
        <mac>address_goes_here</mac>
        <mac>address_goes_here</mac>
        <mac>address_goes_here</mac>
        <mac>address_goes_here<mac>
    </info>
</head>

我不知道如何进一步使用这个列表。

这是有效的,使用javax.xml.parsers和org.w3c.dom中的东西

List<String> macvals = new ArrayList<>();
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = db.parse(new File( "head.xml" ) );
Element rootNode = document.getDocumentElement();
if (rootNode.getTagName().equals("head")) {
    NodeList infos = rootNode.getElementsByTagName("info");
    if( infos.getLength() > 0 ){
    Element info = (Element)infos.item(0);
    NodeList macs = info.getElementsByTagName("mac");
    for( int i = 0; i < macs.getLength(); ++i ){
        macvals.add( macs.item( i ).getTextContent() );
    }
    }
}
System.out.println( macvals );
List macvals=new ArrayList();
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
documentdocument=db.parse(新文件(“head.xml”);
Element rootNode=document.getDocumentElement();
if(rootNode.getTagName().equals(“head”)){
NodeList infos=rootNode.getElementsByTagName(“info”);
如果(infos.getLength()>0){
元素信息=(元素)信息项(0);
NodeList macs=info.getElementsByTagName(“mac”);
对于(int i=0;i
使用javax.xml.parsers和org.w3c.dom中的内容,这是可行的

List<String> macvals = new ArrayList<>();
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = db.parse(new File( "head.xml" ) );
Element rootNode = document.getDocumentElement();
if (rootNode.getTagName().equals("head")) {
    NodeList infos = rootNode.getElementsByTagName("info");
    if( infos.getLength() > 0 ){
    Element info = (Element)infos.item(0);
    NodeList macs = info.getElementsByTagName("mac");
    for( int i = 0; i < macs.getLength(); ++i ){
        macvals.add( macs.item( i ).getTextContent() );
    }
    }
}
System.out.println( macvals );
List macvals=new ArrayList();
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
documentdocument=db.parse(新文件(“head.xml”);
Element rootNode=document.getDocumentElement();
if(rootNode.getTagName().equals(“head”)){
NodeList infos=rootNode.getElementsByTagName(“info”);
如果(infos.getLength()>0){
元素信息=(元素)信息项(0);
NodeList macs=info.getElementsByTagName(“mac”);
对于(int i=0;i
首先,请确保您使用的是JDOM 2.0.6(如果您以后阅读本手册,请确保使用更高版本)。JDOM2.x已经推出5年左右了,它之所以更好是因为它支持Java泛型,它有性能改进,如果您需要的话,它也有更好的XPath支持

尽管如此,您的代码仍然可以“轻松”编写为:

SAXBuilder builder = new SAXBuilder();
Document document = builder.build(new StringReader(content));
Element rootNode = document.getRootElement();
if ("head".equals(rootNode.getName())) {
    String username = rootNode.getChildText("username");
    String error= rootNode.getChildText("error");
    String account= rootNode.getChildText("account_id");
    List<String> macs = new ArrayList<>();
    for (Element info : rootNode.getChildren("info")) {
        for (Element mac : info.getChildren("mac")) {
            macs.add(mac.getValue());
        }
    }
}
但是
getChildren(…)
返回一个列表,因此无法工作。在上面的代码中,我遍历了列表。如果只有一个“info”元素,那么列表将只有一个成员


还要注意的是,在JDOM 2.x中,
getChildren(..)
方法返回一个元素列表:
list
,因此不需要将结果强制转换到
Element

,首先,请确保您使用的是JDOM 2.0.6(如果以后阅读此内容,请确保使用更高版本)。JDOM2.x已经推出5年左右了,它之所以更好是因为它支持Java泛型,它有性能改进,如果您需要的话,它也有更好的XPath支持

尽管如此,您的代码仍然可以“轻松”编写为:

SAXBuilder builder = new SAXBuilder();
Document document = builder.build(new StringReader(content));
Element rootNode = document.getRootElement();
if ("head".equals(rootNode.getName())) {
    String username = rootNode.getChildText("username");
    String error= rootNode.getChildText("error");
    String account= rootNode.getChildText("account_id");
    List<String> macs = new ArrayList<>();
    for (Element info : rootNode.getChildren("info")) {
        for (Element mac : info.getChildren("mac")) {
            macs.add(mac.getValue());
        }
    }
}
但是
getChildren(…)
返回一个列表,因此无法工作。在上面的代码中,我遍历了列表。如果只有一个“info”元素,那么列表将只有一个成员

还要注意,在JDOM 2.x中,
getChildren(..)
方法返回一个元素列表:
list
,因此不需要将结果强制转换到
Element