stax 从元素获取属性值

发布于 2024-12-21 03:44:57 字数 4215 浏览 1 评论 0原文

我尝试使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

辞别 2024-12-28 03:44:57

if(market.equals("获胜/平局/获胜")){
StreamReader.nextTag();

我只快速浏览了一下,但我想说您可能停留在第一个 Occurence 元素,因为您只调用了一次streamReader.nextTag(),但调用了streamReader.getAttributeValue三次。

if(market.equals("Win/Draw/Win")){
streamReader.nextTag();

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.

这样的小城市 2024-12-28 03:44:57

private String xmlFile = "文件位置";
私有字符串desiredAttribute;

...

类加载器 classLoader = this.getClass().getClassLoader();

    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    InputStream inputStream = classLoader.getResourceAsStream(xmlFile);
    XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(inputStream);

try {

        while (xmlEventReader.hasNext()) {
            XMLEvent event = xmlEventReader.nextEvent();

            if (event.isStartElement()) {
                StartElement startElement = event.asStartElement();

                QName qname = startElement.getName();
                String elementName = qname.toString();
                if (elementName.equals("My Element")) {
                    Iterator attributes = startElement.getAttributes();
                    while (attributes.hasNext()) {
                        Attribute attribute = (javax.xml.stream.events.Attribute) (attributes.next());
                        String attribute= attribute.getValue();

                        desiredAttribute = attribute;
                    }

...

您还可以在迭代时检查属性名称

private String xmlFile = "file location";
private String desiredAttribute;

...

ClassLoader classLoader = this.getClass().getClassLoader();

    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    InputStream inputStream = classLoader.getResourceAsStream(xmlFile);
    XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(inputStream);

try {

        while (xmlEventReader.hasNext()) {
            XMLEvent event = xmlEventReader.nextEvent();

            if (event.isStartElement()) {
                StartElement startElement = event.asStartElement();

                QName qname = startElement.getName();
                String elementName = qname.toString();
                if (elementName.equals("My Element")) {
                    Iterator attributes = startElement.getAttributes();
                    while (attributes.hasNext()) {
                        Attribute attribute = (javax.xml.stream.events.Attribute) (attributes.next());
                        String attribute= attribute.getValue();

                        desiredAttribute = attribute;
                    }

...

You can also check for attribute name while iterating

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文