如何使用SAX解析XML中的多个内部子元素

时间:2015-12-20 10:24:17

标签: java xml sax saxparser

我无法解析以下XML。由于子节点<plmn></plmn>有多个条目,因此我无法读取所有值:

<root>
    <EnbProfile>
        <Name>H1K-SAM_untag</Name>
        <Hardware>armony1000</Hardware>
        <PlmnList>
          <Plmn>
            <Mcc>312</Mcc>
            <Mnc>198</Mnc>
          </Plmn>
          <Plmn>
            <Mcc>389</Mcc>
            <Mnc>156</Mnc>
          </Plmn>
        </PlmnList>
    </EnbProfile>
    <EnbProfile>
        <Name>SAM_untag</Name>
        <Hardware>Armony1001</Hardware>
        <PlmnList>
          <Plmn>
            <Mcc>310</Mcc>
            <Mnc>120</Mnc>
          </Plmn>
          <Plmn>
            <Mcc>312</Mcc>
            <Mnc>190</Mnc>
          </Plmn>
        </PlmnList>
    </EnbProfile>
</root>

我是SAX解析的新手。任何人都可以帮我解决这个问题。我想阅读所有父节点和多个子节点。

2 个答案:

答案 0 :(得分:0)

import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException;

public class XMLParserSAX {
    public static void main(String[] args) {
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        try {
            SAXParser saxParser = saxParserFactory.newSAXParser();
            MyHandler handler = new MyHandler();
            saxParser.parse(new File("D:/Projects/AadhaarOfflineVerification/app/src/main/assets/data.xml"), handler);
            List<MyHandler.Data> dataList=handler.getDataList();
            for (MyHandler.Data data:dataList) {
                System.out.println("Data "+data);
            }
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:0)

  

import java.util.ArrayList;导入java.util.List;

     

import org.xml.sax.Attributes;导入org.xml.sax.SAXException;进口   org.xml.sax.helpers.DefaultHandler;

     

公共类MyHandler扩展了DefaultHandler {

private StringBuilder data = null;

public List<Data> getDataList() {
    return dataList;
}

private List<Data> dataList=null;
private List<String> mccList=null;
private List<String> mncList=null;
private Data dataClass=null;

boolean bNames=false;
boolean bHardwares=false;
boolean bMcc=false;
boolean bMnc=false;

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {


    if (qName.equalsIgnoreCase("Name")) {

        bNames=true;
        dataClass=new Data();
        if (dataList==null) {

            dataList=new ArrayList<>();
        }
    }else if (qName.equalsIgnoreCase("Hardware")) {

        bHardwares=true;
    }else if (qName.equalsIgnoreCase("Mcc")) {
        bMcc=true;

        if (mccList==null) {
            mccList=new ArrayList<>();
        }
    }else if (qName.equalsIgnoreCase("Mnc")) {
        bMnc=true;
        if (mncList==null) {
            mncList=new ArrayList<>();
        }
    }

    data = new StringBuilder();
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {


    if (bNames) {
        dataClass.setNames(data.toString());
        bNames=false;
    }else if (bHardwares) {
        dataClass.setHardwares(data.toString());
        bHardwares=false;
    }else if (bMcc) {
        mccList.add(data.toString());
        bMcc=false;
    }else if (bMnc) {
        mncList.add(data.toString());
        bMnc=false;
    }

    if (qName.equalsIgnoreCase("Plmn")) {
        dataClass.setMccList(mccList);
        dataClass.setMncList(mncList);
    }

    if (qName.equalsIgnoreCase("Name")) {

        dataList.add(dataClass);
    }

}

@Override
public void characters(char ch[], int start, int length) throws SAXException {
    data.append(new String(ch, start, length));
}


class Data {

    private String names;
    private String hardwares;

    private List<String> mccList;
    private List<String> mncList;

    public String getNames() {
        return names;
    }

    public void setNames(String names) {
        this.names = names;
    }

    public String getHardwares() {
        return hardwares;
    }

    public void setHardwares(String hardwares) {
        this.hardwares = hardwares;
    }

    public List<String> getMccList() {
        return mccList;
    }

    public void setMccList(List<String> mccList) {
        this.mccList = mccList;
    }

    public List<String> getMncList() {
        return mncList;
    }

    public void setMncList(List<String> mncList) {
        this.mncList = mncList;
    }

    @Override
    public String toString() {
        return "Data:: Name="+this.names+" Hardware="+this.hardwares+" Mcc List="+mccList.toString()+" Mnc
     

List =“ + mncList.toString();           }       }