【问题标题】:When used Hardcoded value only XML parser is working使用硬编码值时,只有 XML 解析器在工作
【发布时间】:2011-11-16 04:25:40
【问题描述】:

这是我的程序, 我正在使用 STAX Parser 来解析 XML 文档。 当我使用硬编码值时,只有它的工作(item.account =“sss”;) 但是,如果我尝试使用 item.account = eventReader.getElementText(); 列表的大小为 0 (列表项 = new ArrayList();)

import java.io.StringReader;
import java.util.*;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

public class Pavan {
    static final String DATE        = "date";
    static final String ITEM        = "item";
    static final String MODE        = "mode";
    static final String UNIT        = "unit";
    static final String CURRENT     = "current";
    static final String INTERACTIVE = "interactive";

    @SuppressWarnings({ "unchecked", "null" })
    public static void main(String args[]) {
        List<Position> items = new ArrayList<Position>();
        try {
            String documentAsString = "<request>\r\n" + "<accountid>1234</accountid>\r\n" + "<accountid>234</accountid>\r\n" + "</request>";

            StringReader stringReadertext = new StringReader(documentAsString);
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            XMLStreamReader reader = inputFactory.createXMLStreamReader(stringReadertext);

            XMLEventReader eventReader = inputFactory.createXMLEventReader(reader);
            Position item = null;

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

                if (event.isStartElement()) {
                    StartElement startElement = event.asStartElement();
                    if (startElement.getName().toString().equals("accountid")) {

                        item = new Position();

                        item.account = "sss";
                        //item.account = eventReader.getElementText();
                    }

                }
                // If we reach the end of an item element we add it to the list
                if (event.isEndElement()) {
                    EndElement endElement = event.asEndElement();
                        if (endElement.getName().toString().equals("accountid")) {
                        items.add(item);
                    }
                }

            }
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
        System.out.println(items.size());
    }

}


class Position
{
String account ;
}

【问题讨论】:

    标签: java xml-parsing stax


    【解决方案1】:

    因为您的结束事件已被“吃掉”,而 if (event.isEndElement()) 从未触发。但是,当您硬编码时,会触发“if (event.isEndElement())”,因为缺少“eventReader.getElementText()”。

    【讨论】:

    • 非常感谢 PeterPeiGuo,为什么 event.isEndElement() 没有被正确调用? if (event.isEndElement()) { EndElement endElement = event.asEndElement(); System.out.println(endElement.getName().getLocalPart());这被调用了,它的打印请求只是,而不是 accountid,为什么会这样??
    • 因为我只发布了一个示例 xml,所以我需要捕获标签数量,然后将其添加到列表中。
    【解决方案2】:

    我相信getElementText() 正在消耗结束事件,所以你的第二个 if 块永远不会进入。该方法的文档有点混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多