【问题标题】:Parsing specific XML file解析特定的 XML 文件
【发布时间】:2014-02-05 04:35:30
【问题描述】:

我在解析 XML 文件时遇到问题。它的结构如下:

    <?xml version="1.0" encoding="UTF-8"?>
<teryt>
<catalog name="TERC" type="all" date="2014-01-01">
<row>
<col name="WOJ">02</col>
<col name="POW"/>
<col name="GMI"/>
<col name="RODZ"/>
<col name="NAZWA">DOLNOŚLĄSKIE</col>
<col name="NAZDOD">województwo</col>
<col name="STAN_NA">2014-01-01</col>
</row>
<row>
<col name="WOJ">02</col>
<col name="POW">01</col>
<col name="GMI"/>
<col name="RODZ"/>
<col name="NAZWA">bolesławiecki</col>
<col name="NAZDOD">powiat</col>
<col name="STAN_NA">2014-01-01</col>
</row>
...
</catalog
</teryt>

我现在有解析器,但它只读取文件到一个变量。我的解析器代码。

package pl.op.web.common;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.primefaces.event.FileUploadEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.io.IOException;
import java.io.InputStream;

@Name("op.xmlParser")
@Scope(ScopeType.SESSION)
public class XMLParser extends DefaultHandler {

    private Logger log = LoggerFactory.getLogger(XMLParser.class);

    private InputStream uploadedAreaFile;

    public void uploadAreaXML(FileUploadEvent event) {
        try {
            uploadedAreaFile = event.getFile().getInputstream();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
        public void getAreaXml() {
            try {
                SAXParserFactory saxParserFactory = SAXParserFactory
                        .newInstance();
                SAXParser saxParser = saxParserFactory.newSAXParser();

                DefaultHandler defaultHandler = new DefaultHandler() {

                    Boolean wojTag = false;
                    Boolean powTag = false;
                    Boolean gmiTag = false;
                    Boolean rodzTag = false;
                    Boolean nazwaTag = false;
                    Boolean nazdodTag = false;
                    Boolean stan_naTag = false;

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

                        if (qName.equalsIgnoreCase("col")) {
                            wojTag = true;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            powTag = true;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            gmiTag = true;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            rodzTag = true;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            nazwaTag = true;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            nazdodTag = true;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            stan_naTag = true;
                        }
                    }

                    public void characters(char ch[], int start, int length)
                            throws SAXException {

                        if (wojTag.equals(true)) {
                            log.info("Woj : "
                                    + new String(ch, start, length));
                        }
                        if (powTag.equals(true)) {
                            log.info("Pow : "
                                    + new String(ch, start, length));
                        }
                        if (gmiTag.equals(true)) {
                            log.info("Gmi : "
                                    + new String(ch, start, length));
                        }
                        if (rodzTag.equals(true)) {
                            log.info("Rodz : "
                                    + new String(ch, start, length));
                        }
                        if (nazwaTag.equals(true)) {
                            log.info("Nazwa : "
                                    + new String(ch, start, length));
                        }
                        if (nazdodTag.equals(true)) {
                            log.info("Nazdod : "
                                    + new String(ch, start, length));
                        }
                        if (stan_naTag.equals(true)) {
                            log.info("Stan_na : "
                                    + new String(ch, start, length));
                        }
                    }

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

                        if (qName.equalsIgnoreCase("col")) {
                            wojTag = false;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            powTag = false;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            gmiTag = false;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            rodzTag = false;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            nazwaTag = false;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            nazdodTag = false;
                        }
                        if (qName.equalsIgnoreCase("col")) {
                            stan_naTag = false;
                        }
                    }
                };

            saxParser.parse(uploadedAreaFile, defaultHandler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}    

如何在单个变量中包含每个属性(WOJ、POW、NAZWA 等)?

【问题讨论】:

  • 我无法得到您想要的输出?您能否键入您需要的输出示例? @Nidhhog
  • 我希望将 中的每个数据都放入一个变量中。像来自 02 的数据我想在 String woj 中作为“02”等等。
  • 所以您只需要包含 col 中所有数据的 String 变量?
  • 对于 col 的一个数据,我需要一个字符串,因为我需要将这些数据从字符串发送到数据库。
  • 我需要通过 SAX 来制作它,因为 XML 文件对于 DOM 解析器来说太大了。

标签: java xml xml-parsing sax


【解决方案1】:

你可以这样做......

package pl.op.web.common;

import java.util.ArrayList;

import java.util.List;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class XMLParser extends DefaultHandler {
    public static void main(String[] args) {
        XMLParser parser = new XMLParser();
        parser.getAreaXml();
    }

    public void getAreaXml() {
        final List<StringBuilder> first = new ArrayList<StringBuilder>();
        try {
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            SAXParser saxParser = saxParserFactory.newSAXParser();
            DefaultHandler defaultHandler = new DefaultHandler() {
                Boolean wojTag = false;
                Boolean powTag = false;
                Boolean gmiTag = false;
                Boolean rodzTag = false;
                Boolean nazwaTag = false;
                Boolean nazdodTag = false;
                Boolean stan_naTag = false;

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

                    if (qName.equalsIgnoreCase("col")) {
                        if (attributes.getValue(0) != null)
                            if (attributes.getValue(0).equalsIgnoreCase("WOJ"))
                                wojTag = true;

                        if (attributes.getValue(0) != null)
                            if (attributes.getValue(0).equalsIgnoreCase("POW"))
                                powTag = true;

                        if (attributes.getValue(0) != null)
                            if (attributes.getValue(0).equalsIgnoreCase("GMI"))
                                gmiTag = true;

                        if (attributes.getValue(0) != null)
                            if (attributes.getValue(0).equalsIgnoreCase("RODZ"))
                                rodzTag = true;

                        if (attributes.getValue(0) != null)
                            if (attributes.getValue(0)
                                    .equalsIgnoreCase("NAZWA"))
                                nazwaTag = true;

                        if (attributes.getValue(0) != null)
                            if (attributes.getValue(0).equalsIgnoreCase(
                                    "NAZDOD"))
                                nazdodTag = true;
                        if (attributes.getValue(0) != null)
                            if (attributes.getValue(0).equalsIgnoreCase(
                                    "STAN_NA"))
                                stan_naTag = true;
                    }
                }

                public void characters(char ch[], int start, int length)
                        throws SAXException {

                    StringBuilder temp = new StringBuilder();

                    if (wojTag.equals(true)) {

                        temp.append(new String(ch, start, length));
                        temp.append("  ");
                    }
                    if (powTag.equals(true)) {

                        temp.append(new String(ch, start, length));
                        temp.append("  ");
                    }
                    if (gmiTag.equals(true)) {

                        temp.append(new String(ch, start, length));
                        temp.append("  ");
                    }
                    if (rodzTag.equals(true)) {

                        temp.append(new String(ch, start, length));
                        temp.append("  ");
                    }
                    if (nazwaTag.equals(true)) {

                        temp.append(new String(ch, start, length));
                        temp.append("  ");
                    }
                    if (nazdodTag.equals(true)) {

                        temp.append(new String(ch, start, length));
                        temp.append("  ");
                    }
                    if (stan_naTag.equals(true)) {

                        temp.append(new String(ch, start, length));
                        temp.append("  ");
                    }

                    first.add(temp);
                }

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

                    if (qName.equalsIgnoreCase("col")) {
                        wojTag = false;
                    }
                    if (qName.equalsIgnoreCase("col")) {
                        powTag = false;
                    }
                    if (qName.equalsIgnoreCase("col")) {
                        gmiTag = false;
                    }
                    if (qName.equalsIgnoreCase("col")) {
                        rodzTag = false;
                    }
                    if (qName.equalsIgnoreCase("col")) {
                        nazwaTag = false;
                    }
                    if (qName.equalsIgnoreCase("col")) {
                        nazdodTag = false;
                    }
                    if (qName.equalsIgnoreCase("col")) {
                        stan_naTag = false;
                    }
                }
            };

            saxParser.parse("E:/ResourcePDF/zippertest/src/test.xml",
                    defaultHandler);

            for (StringBuilder s : first) {
                System.out.print(s);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述xml文件的输出将是这样的

02 DOLNO?L?SKIE województwo 2014-01-01 02 01 boles?awiecki powiat 2014-01-01

我正在将数据 btw 行标记放入一个 StringBuilder。并将其添加到“第一个” stringBuilder List 。然后打印出来。

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多