繁体   English   中英

如何在 Java 中使用 saxparser 读取嵌套的 xml 元素

[英]How to read nested xml element with saxparser in Java

请您帮我解决我在探索 saxparser 过程中遇到的问题。

我的 xml 文件

<row>
    <PSC>10000</PSC>
    <NAZEV>Praha 10</NAZEV>
    <ADRESA>Černokostelecká 2020/20, Strašnice, 10000, Praha 10</ADRESA>
    <TYP>pošta</TYP>
    <OTEV_DOBY>
        <den name="Pondělí">
            <od_do>
                <od>08:00</od>
                <do>19:30</do>
            </od_do>
        </den>
        <den name="Úterý">
            <od_do>
                <od>08:00</od>
                <do>19:30</do>
            </od_do>
        </den>
        <den name="Středa">
            <od_do>
                <od>08:00</od>
                <do>19:30</do>
            </od_do>
        </den>
        <den name="Čtvrtek">
            <od_do>
                <od>08:00</od>
                <do>19:30</do>
            </od_do>
        </den>
        <den name="Pátek">
            <od_do>
                <od>08:00</od>
                <do>19:30</do>
            </od_do>
        </den>
        <den name="Sobota">
            <od_do>
                <od>09:00</od>
                <do>13:00</do>
            </od_do>
        </den>
        <den name="Neděle"/>
    </OTEV_DOBY>
    <SOUR_X>1044922.91</SOUR_X>
    <SOUR_Y>737904.98</SOUR_Y>
    <OBEC>Praha</OBEC>
    <C_OBCE>Strašnice</C_OBCE>
    <SOUR_X_WGS84>14.492777</SOUR_X_WGS84>
    <SOUR_Y_WGS84>50.076442</SOUR_Y_WGS84>
    <STAV>nová</STAV>
</row>

我尝试捕捉打开和关闭时间,从元素“od”和“do”这是我在 startElement 中的代码

else if (qName.equalsIgnoreCase("OTEV_DOBY")) {
        otwarte = new Otwarte();
        b_otev_doby = true;
    }
    if (qName.equalsIgnoreCase("den")) {
        den = attributes.getValue("name");
        if (den.equalsIgnoreCase("Pondělí")) {
            if (qName.equalsIgnoreCase("od"))
                b_od_Pn = true;
            else if (qName.equalsIgnoreCase("do"))
                b_do_Pn = true;
        } else if (den.equalsIgnoreCase("Úterý")) {
            if (qName.equalsIgnoreCase("od")) {
                b_od_Wt = true;
            } else if (qName.equalsIgnoreCase("do")) {
                b_do_Wt = true;
            }
        } else if (den.equalsIgnoreCase("Středa")) {
            if (qName.equalsIgnoreCase("od")) {
                b_od_Sr = true;
            } else if (qName.equalsIgnoreCase("do")) {
                b_do_Sr = true;
            }
        } else if (den.equalsIgnoreCase("Čtvrtek")) {
            if (qName.equalsIgnoreCase("od")) {
                b_od_Cz = true;
            } else if (qName.equalsIgnoreCase("do")) {
                b_do_Cz = true;
            }
        } else if (den.equalsIgnoreCase("Pátek")) {
            if (qName.equalsIgnoreCase("od")) {
                b_od_Pt = true;
            } else if (qName.equalsIgnoreCase("do")) {
                b_do_Pt = true;
            }
        } else if (den.equalsIgnoreCase("Sobota")) {
            if (qName.equalsIgnoreCase("od")) {
                b_od_Sob = true;
            } else if (qName.equalsIgnoreCase("do")) {
                b_do_Sob = true;
            }
        } else if (den.equalsIgnoreCase("Neděle")) {
            if (qName.equalsIgnoreCase("od")) {
                b_od_Nd = true;
            } else if (qName.equalsIgnoreCase("do")) {
                b_do_Nd = true;
            }
        }
    }

在嵌套 if "if (qName.equalsIgnoreCase("od"))" 我总是得到 "Condition 'qName.equalsIgnoreCase("od")' is always 'false'" 并且结果 _> Otwarte{pn_od='null', pn_do='null'。 任何想法如何解决这个问题。

下面的示例将使用布尔值来验证您在解析时所处的位置。

请参阅参考: 如何在 startElement 中使用 SAX 解析器从 XML 获取元素的值?

   public class SimpleHandler extends DefaultHandler {


    class DenObject{
        public String od;
        public String do;

       //Getters/Setters
    }

    boolean isDo, isOd;

    DenObject currentDenObj;

    List<DenObject> denObjects = new ArrayList<>();

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

        if(qName.equals("den")){ 
            currentDenObj = new DenObject ();
        }
        if(qName.equals("do")) { isDo = true; }
        if(qName.equals("od"))  { isOd = true;  }
    }

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

        if(qName.equals("den")) {
            denObjects .add(currentDenObj);
            currentDenObj = null;
        }
        if(qName.equals("do")) { isDo = false; }
        if(qName.equals("od"))  { isOd = false;  }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (isDo) {
            currentDenObj.setDo(new String(ch, start, length));
        }
        if (isOd) {
            currentDenObj.setOd(new String(ch, start, length));
        }
    }

  @Override
    public void endDocument() throws SAXException {
        for(DenObject denObject : denObjects ) {

                System.out.println(denObject);
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM