Java XMLStreamReader提供了不需要的字符串

时间:2012-08-09 09:50:24

标签: java xml xsd xml-parsing xmlstreamreader

我有一些xml我在这里读它是。

<application>
    <client>website</client>
    <register>
        <name>
            <first>Tommy</first>
            <second>Jay</second>
        </name>
        <address>
            <firstLine>line1</firstLine>
            <secondLine>line2</secondLine>
            <city>city1</city>
            <county>county1</county>
            <postcode>YY12 9UY</postcode>
        </address>
    </register>
</application>

无论如何,当我用xmlStreamReader读取它时,如下所示

public XMLElementALT getNextElement()
{
    element = new XMLElementALT();
    int event;
    try
    {
        event = reader.next();
    } 
    catch (XMLStreamException ex)
    {
        return null;
    }

    if (event == XMLStreamConstants.START_ELEMENT)
    {
        element.setTag(reader.getLocalName());
    }
    else if (event == XMLStreamConstants.CHARACTERS)
    {
        element.setAttribute(reader.getText());
    }
    else if (event == XMLStreamConstants.END_ELEMENT)
    {
        element.setEndTag(reader.getLocalName());
    }
    else if (event == XMLStreamConstants.END_DOCUMENT)
    {
        element.setFinished();
    }
    return element;
}

一切顺利!但是我遇到的问题是,在读取标签后,我得到的下一个事件是事件XMLStreamConstants.CHARACHTERS并报告我有属性(“\ n”),它是标签和下一个标签之间的空格。我该如何删除?我希望将下一个事件作为XMLStreamConstants.START_ELEMENT。我知道我可以将我的XML全部放在一行上,但是当我输入它时我喜欢有间隙,以便我可以看到结构。我还有一个xsd来验证,这会成功验证xml,他们可以在xsd中做些什么来移除空格?

由于

1 个答案:

答案 0 :(得分:3)

您可以在CHARACTERS方法中或在创建阅读器时使用过滤器忽略仅包含空格的getNextElement个事件

XMLInputFactory factory = XMLInputFactory.newFactory();
XMLStreamReader rawReader = factory.createXMLStreamReader(...);
XMLStreamReader filteredReader = factory.createFilteredReader(rawReader,
  new StreamFilter() {
    public boolean accept(XMLStreamReader r) {
      return !r.isWhiteSpace();
    }
  });

如果当前事件是完全由空格组成的isWhiteSpace事件,则CHARACTERS方法返回true。如果它不是CHARACTERS事件,或者它是CHARACTERS但不是所有空格,则返回false。

但是,重要的是要注意XMLStreamReader 保证在单个CHARACTERS事件中返回元素的所有文本内容,允许给你几个独立的字符块,你必须自己连接在一起。