詹学伟
詹学伟
Published on 2024-05-11 / 22 Visits
0
0

Java-SAX解析XML

本次例子中,xml存储于本地,

<?xml version="1.0" ?>

<PCXRF_MULTI_FORMAT>

<PCXRF_USER_FORMAT>
<FileInfo>
 <DataVersion>
  <Major>0</Major>
  <Minor>0</Minor>
  <Release>7</Release>
 </DataVersion>
	<SampleName>0140中</SampleName>
	<AnalType>QN</AnalType>
	<Comment>AAAA</Comment>
	<ParFLN>2-aaaa</ParFLN>
	<MeasDateStr>2024-12-12 23:59:59</MeasDateStr>
	<Operator></Operator>
</FileInfo>
<ResQuan_Aver ChanNum="21" SampleForm="Bulk" >
	<ResQuan_Aver_Chan Number="1">
		<CompName>TFe</CompName>
		<Conc> 48.00</Conc>
		<Unit>%</Unit>
		<LH></LH>
		<ProcType>Quant.-EC</ProcType>
		<Elem>Fe</Elem>
		<Line>Ka</Line>
		<Net_Inten>3.9411</Net_Inten>
		<BG_Inten>0.0000</BG_Inten>
		<LayerNum>1</LayerNum>
		<LayerInfo>Elem</LayerInfo>
	</ResQuan_Aver_Chan>
	<ResQuan_Aver_Chan Number="2">
		<CompName>CaO</CompName>
		<Conc>0.03</Conc>
		<Unit>%</Unit>
		<LH></LH>
		<ProcType>Quant.-EC</ProcType>
		<Elem>Ca</Elem>
		<Line>Ka</Line>
		<Net_Inten>0.4185</Net_Inten>
		<BG_Inten>0.0000</BG_Inten>
		<LayerNum>1</LayerNum>
		<LayerInfo>Elem</LayerInfo>
	</ResQuan_Aver_Chan>
</ResQuan_Aver>
</PCXRF_USER_FORMAT>

</PCXRF_MULTI_FORMAT>

代码:

public void start() {
        try {
            File xmlFile = new File(LOCAL_XML_PATH);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            SAXParserHandler handler = new SAXParserHandler();
            saxParser.parse(xmlFile, handler);
            Result result = handler.getResult();
          	log.info("result:{}",result);
        } catch (ParserConfigurationException | SAXException | IOException e) {
            log.error("解析xml出错:{}",e.getMessage());
        }
    }

代码:

public static class SAXParserHandler extends DefaultHandler {

        private String value = "";

        private final FileInfo fileInfo = new FileInfo();

        private AnalyseData analyseData = null;

        private final List<AnalyseData> analyseDataList = new ArrayList<>();

        private final Result result = new Result();

        public Result getResult() {
            result.setFileInfo(fileInfo);
            result.setAnalyseDataList(analyseDataList);
            return result;
        }

        @Override
        public void startDocument() throws SAXException {
            System.out.println("SAX解析开始...");
        }

        @Override
        public void endDocument() throws SAXException {
            System.out.println("SAX解析结束======");
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            if (qName.equals("ResQuan_Aver_Chan")) {
                analyseData = new AnalyseData();
                int num = attributes.getLength();
                for (int i = 0; i < num; i++) {
                    if (attributes.getQName(i).equals("Number")) {
                        analyseData.setNumber(attributes.getValue(i));
                    }
                }
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // info
            if (qName.equals("SampleName")) {
                fileInfo.setSampleName(value);
            }
            if (qName.equals("AnalType")) {
                fileInfo.setAnalType(value);
            }
            if (qName.equals("Comment")) {
                fileInfo.setComment(value);
            }
            if (qName.equals("ParFLN")) {
                fileInfo.setParFLN(value);
            }
            if (qName.equals("MeasDateStr")) {
                fileInfo.setMeasDateStr(value);
            }
            if (qName.equals("Operator")) {
                fileInfo.setOperator(value);
            }
            // data
            if (qName.equals("CompName")) {
                analyseData.setCompName(value);
            }
            if (qName.equals("Conc")) {
                analyseData.setConc(value);
            }
            if (qName.equals("Unit")) {
                analyseData.setUnit(value);
            }
            if (qName.equals("LH")) {
                analyseData.setLh(value);
            }
            if (qName.equals("ProcType")) {
                analyseData.setProcType(value);
            }
            if (qName.equals("Elem")) {
                analyseData.setElem(value);
            }
            if (qName.equals("Line")) {
                analyseData.setLine(value);
            }
            if (qName.equals("Net_Inten")) {
                analyseData.setNetInten(value);
            }
            if (qName.equals("BG_Inten")) {
                analyseData.setBGInten(value);
            }
            if (qName.equals("LayerNum")) {
                analyseData.setLayerNum(value);
            }
            if (qName.equals("LayerInfo")) {
                analyseData.setLayerInfo(value);
            }
            if(qName.equals("ResQuan_Aver_Chan")){
                analyseDataList.add(analyseData);
                analyseData = null;
            }
        }

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


Comment