3

我有一些正在阅读的 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中做些什么来删除空格?

谢谢

4

1 回答 1

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但是,重要的是要注意 an不能保证在一个CHARACTERS事件中返回元素的所有文本内容,它允许为您提供几个单独的字符块,您必须自己将它们连接在一起。

于 2012-08-09T11:09:15.507 回答