java - 如何在 Java 中使用 saxparser 读取嵌套的 xml 元素
问题描述
请您帮我解决我在探索 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")' 总是 '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);
}
}
}
推荐阅读
- apache-spark-sql - 如何定义 ebcdic 文件的记录结构?
- c# - 如何从 Angular 将字符串发布到 ASP.NET Core 操作方法?
- flutter - 无法从抽屉中关闭 alertDialog
- jenkins - 无法连接到存储库 Jenkins 设置版本 2.249.1
- javascript - 在反应中显示来自文本的链接
- forms - Thymeleaf 表单未提交给 Spring 引导控制器
- python - Python / JSON - TypeError:列表索引必须是整数或切片,而不是 str
- r - 删除重复的行,只保留那些具有完整列的行
- javascript - 为什么“menuBtn.addEventListner”不是一个函数?
- c# - 不调试时无法通过路由访问组件