当前位置: 首页 > 面试题库 >

使用StAX读取XML字符串

严琨
2023-03-14
问题内容

我第一次使用stax解析XML字符串。我找到了一些示例,但无法使我的代码正常工作。这是我的代码的最新版本:

public class AddressResponseParser
{
    private static final String STATUS = "status";
    private static final String ADDRESS_ID = "address_id";
    private static final String CIVIC_ADDRESS = "civic_address";

    String status = null;
    String addressId = null;
    String civicAddress = null;

    public static AddressResponse parseAddressResponse(String response)
    {

        try
        {
            byte[] byteArray = response.getBytes("UTF-8");
            ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream);

            while (reader.hasNext())
            {
                int event = reader.next();

                if (event == XMLStreamConstants.START_ELEMENT)
                {
                    String element = reader.getLocalName();

                    if (element.equals(STATUS))
                    {
                        status = reader.getElementText();
                        continue;
                    }

                    if (element.equals(ADDRESS_ID))
                    {
                        addressId = reader.getText();
                        continue;
                    }

                    if (element.equals(CIVIC_ADDRESS))
                    {
                        civicAddress = reader.getText();
                        continue;
                    }
                }
            }
        }
        catch (Exception e)
        {
            log.error("Couldn't parse AddressResponse", e);
        }
    }
}

我将手表放在“事件”和“ reader.getElementText()”上。当代码停止时

String element = reader.getLocalName();

将显示“ reader.getElementText()”值,但是一旦它偏离该行,就无法评估。当代码停止时:

status = reader.getElementText();

“元素”手表显示正确的值。最后,当我又将代码步进一行时,我捕获了此异常:

(com.ctc.wstx.exc.WstxParsingException) com.ctc.wstx.exc.WstxParsingException: Current state not START_ELEMENT
 at [row,col {unknown-source}]: [1,29]

我尝试使用status = reader.getText();代替,但随后出现此异常:

(java.lang.IllegalStateException) java.lang.IllegalStateException: Not a textual event (END_ELEMENT)

有人可以指出我在做什么错吗?

编辑:

添加用于测试的JUnit代码:

public class AddressResponseParserTest
{
    private String status = "OK";
    private String address_id = "123456";
    private String civic_address = "727";

    @Test
    public void testAddressResponseParser() throws UnsupportedEncodingException, XMLStreamException
    {
        AddressResponse parsedResponse = AddressResponseParser.parseAddressResponse(this.responseXML());

        assertEquals(this.status, parsedResponse.getStatus());

        assertEquals(this.address_id, parsedResponse.getAddress()
                .getAddressId());
        assertEquals(this.civic_address, parsedResponse.getAddress()
                .getCivicAddress());
    }

    private String responseXML()
    {
        StringBuffer buffer = new StringBuffer();

        buffer.append("<response>");
        buffer.append("<status>OK</status>");
        buffer.append("<address>");
        buffer.append("<address_id>123456</address_id>");
        buffer.append("<civic_address>727</civic_address>");
        buffer.append("</address>");
        buffer.append("</response>");

        return buffer.toString();
    }
}

问题答案:

我找到了一个使用XMLEventReader而不是XMLStreamReader的解决方案:

public MyObject parseXML(String xml)
    throws XMLStreamException, UnsupportedEncodingException
{
    byte[] byteArray = xml.getBytes("UTF-8");
    ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    XMLEventReader reader = inputFactory.createXMLEventReader(inputStream);

    MyObject object = new MyObject();

    while (reader.hasNext())
    {
        XMLEvent event = (XMLEvent) reader.next();

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

            if (element.getName().getLocalPart().equals("ElementOne"))
            {
                event = (XMLEvent) reader.next();

                if (event.isCharacters())
                {
                     String elementOne = event.asCharacters().getData();
                     object.setElementOne(elementOne);
                }
                continue;
            }
            if (element.getName().getLocalPart().equals("ElementTwo"))
            {
                event = (XMLEvent) reader.next();
                if (event.isCharacters())
                {
                     String elementTwo = event.asCharacters().getData();
                     object.setElementTwo(elementTwo);
                }
                continue;
            }
        }
    }

    return object;
}

我仍然会对看到使用XMLStreamReader的解决方案感兴趣。



 类似资料:
  • 问题内容: 我需要阅读几个大(200Mb-500Mb)XML文件,所以我想使用StaX。我的系统有两个模块- 一个用于读取文件(使用StaX);另一个用于读取文件。另一个模块(“解析器”模块)假定获取该XML的单个条目并使用DOM对其进行解析。我的XML文件没有特定的结构-因此我无法使用JaxB。如何向“解析器”模块传递要解析的特定条目?例如: 我想使用StaX来解析该文件-但是每个“项目”条目都

  • 问题内容: xml看起来像这样: 我正在使用stax一次处理一个“ ”,并且可以正常工作。我需要以字符串的形式获取整个语句节点,以便创建“ 123.xml”和“ 456.xml”,甚至可以将其加载到按帐户索引的数据库表中。 使用这种方法:http : //www.devx.com/Java/Article/30298/1954 我正在寻找做这样的事情: 问题答案: 为什么不只使用xpath? 您可

  • 问题内容: 输入文件包含数千个XML格式的事务,大小约为10GB。要求是根据用户输入选择每个事务XML,并将其发送到处理系统。 文件的样本内容 希望(技术)用户提供输入标签名称,例如。 我们希望提供更通用的解决方案。文件内容可能会有所不同,用户可以使用XPath表达式(例如“ ”)来选择单个事务。 这里我们需要考虑的技术问题很少 该文件可以位于共享位置或FTP 由于文件很大,因此我们无法在JVM中

  • 我试图理解STAX java的机制是如何工作的。 我有这个xml文件 为了模仿这个XML文件的行为,我们创建了一个具有相似属性的对象 有了这个,我尝试读取我的xml文件: 我的问题是,它们是5个产品,但当我试图输出它们时,它们不是正确的数字。1.If in:If(startElement.getName().getLocalPart()。equals(“orders”))最后一个参数是“oders

  • 如何编写java类来读取此XMl文件 我试过这样 但我得到了这个错误 请帮我解决这个问题。。。 非常感谢。

  • 我想从RSS提要中读出一个带有简单XML的特定属性。 项目示例: 我想阅读媒体中的网址:内容。 读取我使用的其他标记:$xml- 读取我尝试的媒体url属性:$xml- 但这只是返回NULL。它与内容有关,内容是一个名称空间。