[英]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.