使用XMLStreamWriter时如何保留属性中的空格?

时间:2011-11-30 18:59:19

标签: java xml

使用javax.xml.XMLStreamWriter时,有没有办法保留属性中的空格?我理解XMLStreamReader将执行Attribute-Value Normalization,将XML中的\r\n\t转换为空格,因此编写者可以发出实体引用(例如
)来保留空白。有没有办法告诉作者使用空格的实体引用?我可以自己添加对属性的实体引用吗?

以下JUnit3测试通过。当我编码"Hello,\r\n\tworld"时,我希望得到同样的东西。但相反,解码后的值为"Hello  world"(两个空格)。

import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.stream.*;
import junit.framework.TestCase;
public class XmlStreamTest extends TestCase {
    public void testAttribute() throws XMLStreamException {
        StringWriter stringWriter = new StringWriter();
        XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newFactory().createXMLStreamWriter(stringWriter);
        xmlStreamWriter.writeStartDocument();
        xmlStreamWriter.writeStartElement("root");
        xmlStreamWriter.writeAttribute("a", "Hello,\r\n\tWorld! ");
        xmlStreamWriter.writeEndElement();
        xmlStreamWriter.writeEndDocument();
        xmlStreamWriter.close();
        assertEquals("<?xml version=\"1.0\" ?><root a=\"Hello,\r\n\tWorld! \"></root>", stringWriter.toString());

        StringReader stringReader = new StringReader(stringWriter.toString());
        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(stringReader);
        assertEquals(XMLStreamConstants.START_DOCUMENT, xmlStreamReader.getEventType());
        assertEquals(XMLStreamConstants.START_ELEMENT, xmlStreamReader.next());
        // This is not what I want! I want the value to be the same as I originally gave!
        assertEquals("Hello,  World! ", xmlStreamReader.getAttributeValue(null, "a"));
        assertEquals(XMLStreamConstants.END_ELEMENT, xmlStreamReader.next());
        assertEquals(XMLStreamConstants.END_DOCUMENT, xmlStreamReader.next());
    }
}

0 个答案:

没有答案