stax 从元素获取属性值
我尝试使用 STAX 从 URI 解析 XML 文件!
XML 看起来像这样:
<Type type_id="4218">
<Title>English Premier League</Title>
<Event start_time="2011-12-18 16:10:00" ev_id="2893772">
<Description>Manchester City v Arsenal</Description>
<Market mkt_typ="Win/Draw/Win">
<Occurrence bet_id="42455761" decimal="1.6666666666667">
<Description>Manchester City</Description>
</Occurrence>
<Occurrence bet_id="42455762" decimal="3.6">
<Description>Draw</Description>
</Occurrence>
<Occurrence bet_id="42455764" decimal="5">
<Description>Arsenal</Description>
</Occurrence>
</Market>
</Event>
</Type>
输出应该是:
id:4218
title:English Premier League
ev_id:2893772
date of match:Sun Dec 18 16:10:00 CET 2011
description:Manchester City v Arsenal
one:1.6666666666667
draw:3.6
two:5
我的代码看起来像这样:
XMLInputFactory factory = XMLInputFactory.newInstance();
try {
XMLStreamReader streamReader = factory.createXMLStreamReader(new URL("http://cubs.bluesq.com/cubs/cubs.php?action=getpage&thepage=385.xml").openStream());
while (streamReader.hasNext()) {
int event = streamReader.next();
if(event == XMLStreamConstants.START_ELEMENT){
if(streamReader.getLocalName().equals("Type")){
long id = Integer.parseInt(streamReader.getAttributeValue(null, "type_id"));
if( id == 4218){
System.out.println("id:"+id);
streamReader.nextTag();
System.out.println("title:"+streamReader.getElementText());
streamReader.nextTag();
int ev_id = Integer.parseInt(streamReader.getAttributeValue(null, "ev_id"));
System.out.println("ev_id:"+ev_id);
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
formater.setTimeZone(TimeZone.getTimeZone("CET"));
String tempDatum = streamReader.getAttributeValue(null,"start_time");
Date dateOfMatch = formater.parse(tempDatum);
System.out.println("date of match:"+dateOfMatch);
streamReader.nextTag();
String description = streamReader.getElementText();
System.out.println("description:"+ description);
streamReader.nextTag();
String market = streamReader.getAttributeValue(null, "mkt_typ");
if(market.equals("Win/Draw/Win")){
streamReader.nextTag();
double one = Double.parseDouble(streamReader.getAttributeValue(null, "decimal"));
System.out.println("one:"+ one);
double draw = Double.parseDouble(streamReader.getAttributeValue(null, "decimal"));
System.out.println("draw:"+draw);
double two = Double.parseDouble(streamReader.getAttributeValue(null, "decimal"));
System.out.println("two:"+two);
}
}
}
}
}
此代码产生输出:
id:4218
title:English Premier League
ev_id:2893772
date of match:Sun Dec 18 16:10:00 CET 2011
description:Manchester City v Arsenal
one:1.6666666666667
draw:1.6666666666667
two:1.6666666666667
如何从元素“Occurrence”中的属性“decimal”获取其他值???
I try to parse XML file from URI using STAX!
XML looking something like this:
<Type type_id="4218">
<Title>English Premier League</Title>
<Event start_time="2011-12-18 16:10:00" ev_id="2893772">
<Description>Manchester City v Arsenal</Description>
<Market mkt_typ="Win/Draw/Win">
<Occurrence bet_id="42455761" decimal="1.6666666666667">
<Description>Manchester City</Description>
</Occurrence>
<Occurrence bet_id="42455762" decimal="3.6">
<Description>Draw</Description>
</Occurrence>
<Occurrence bet_id="42455764" decimal="5">
<Description>Arsenal</Description>
</Occurrence>
</Market>
</Event>
</Type>
output should be:
id:4218
title:English Premier League
ev_id:2893772
date of match:Sun Dec 18 16:10:00 CET 2011
description:Manchester City v Arsenal
one:1.6666666666667
draw:3.6
two:5
My code looks something like this:
XMLInputFactory factory = XMLInputFactory.newInstance();
try {
XMLStreamReader streamReader = factory.createXMLStreamReader(new URL("http://cubs.bluesq.com/cubs/cubs.php?action=getpage&thepage=385.xml").openStream());
while (streamReader.hasNext()) {
int event = streamReader.next();
if(event == XMLStreamConstants.START_ELEMENT){
if(streamReader.getLocalName().equals("Type")){
long id = Integer.parseInt(streamReader.getAttributeValue(null, "type_id"));
if( id == 4218){
System.out.println("id:"+id);
streamReader.nextTag();
System.out.println("title:"+streamReader.getElementText());
streamReader.nextTag();
int ev_id = Integer.parseInt(streamReader.getAttributeValue(null, "ev_id"));
System.out.println("ev_id:"+ev_id);
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
formater.setTimeZone(TimeZone.getTimeZone("CET"));
String tempDatum = streamReader.getAttributeValue(null,"start_time");
Date dateOfMatch = formater.parse(tempDatum);
System.out.println("date of match:"+dateOfMatch);
streamReader.nextTag();
String description = streamReader.getElementText();
System.out.println("description:"+ description);
streamReader.nextTag();
String market = streamReader.getAttributeValue(null, "mkt_typ");
if(market.equals("Win/Draw/Win")){
streamReader.nextTag();
double one = Double.parseDouble(streamReader.getAttributeValue(null, "decimal"));
System.out.println("one:"+ one);
double draw = Double.parseDouble(streamReader.getAttributeValue(null, "decimal"));
System.out.println("draw:"+draw);
double two = Double.parseDouble(streamReader.getAttributeValue(null, "decimal"));
System.out.println("two:"+two);
}
}
}
}
}
This code produce output:
id:4218
title:English Premier League
ev_id:2893772
date of match:Sun Dec 18 16:10:00 CET 2011
description:Manchester City v Arsenal
one:1.6666666666667
draw:1.6666666666667
two:1.6666666666667
how do I get others value from atribute "decimal" in elements "Occurrence"???
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我只快速浏览了一下,但我想说您可能停留在第一个 Occurence 元素,因为您只调用了一次streamReader.nextTag(),但调用了streamReader.getAttributeValue三次。
I only had a quick look, but I would say you probably are staying at the first Occurence element since you're calling streamReader.nextTag() only once, but streamReader.getAttributeValue three times.
private String xmlFile = "文件位置";
私有字符串desiredAttribute;
...
类加载器 classLoader = this.getClass().getClassLoader();
try {
...
您还可以在迭代时检查属性名称
private String xmlFile = "file location";
private String desiredAttribute;
...
ClassLoader classLoader = this.getClass().getClassLoader();
try {
...
You can also check for attribute name while iterating