伙计们。
我花了很长时间试图了解这是一个错误还是我自己缺乏教育。基本上,我试图对特定元素做出反应,并使用 Java StAX API 使用 Transformer 读取其内容。
当 XML 格式正确或元素之间有空格时,一切正常。但是,一旦它看到元素之间没有空白字符的 XML,它就会严重中断。
有代码及其输出来说明问题。
有 3 个示例 XML,前 2 个显示 2 个不同的中断场景,最后一个显示正确处理:
在第一个没有空格的场景中,它会跳过一些元素。在下面的示例中,它跳过了除一个“节点”元素之外的所有元素。在现实世界的场景中,虽然它会跳过所有其他节点。可能是因为节点内容更丰富。
在第二种情况下,我只在节点元素之间添加了空间。如您所见,它无法正确处理文档的结尾。
在最后一个场景中,我在最后一个节点和关闭根元素之间添加了空间。处理如期进行。
在我的现实世界场景中,我希望使用单行无分隔符 XML,因此我需要场景 1 正常工作,并且很高兴知道对 XML 的有效更改(例如在元素之间添加空格)不会中断处理就像在场景 2 中一样。
请帮忙!!!
单类应用程序 test.StAXTest 的完整代码:
package test;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;
public class StAXTest {
private final static String XML1 = "<root><node></node><node></node></root>";
private final static String XML2 = "<root><node></node> <node></node></root>";
private final static String XML3 = "<root><node></node> <node></node> </root>";
public static void main(String[] args) throws Exception {
processXML(XML1);
processXML(XML2);
processXML(XML3);
}
private static void processXML(String xml) {
try {
System.out.println("XML Input:\n" + xml + "\nProcessing:");
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader reader = xif.createXMLStreamReader(new StringReader(xml));
TransformerFactory tf = TransformerFactory.newInstance();
int nodeCount = 0;
while (reader.nextTag() == XMLStreamConstants.START_ELEMENT) {
String localName = reader.getLocalName();
if (localName.equals("node")) {
Transformer t = tf.newTransformer();
StringWriter st = new StringWriter();
t.transform(new StAXSource(reader), new StreamResult(st));
String xmlNode = st.toString();
System.out.println(nodeCount + ": " + xmlNode);
nodeCount++;
}
}
} catch (Throwable t) {
t.printStackTrace(System.out);
}
System.out.println("------------------------------------------------");
}
}
应用程序输出,其中包含所有 3 个场景。请注意,在第一个场景中,转换后的 XML 部分包含 1 个节点,而不是 2 个。所以第二个节点完全“在翻译中丢失”。
XML Input:
<root><node></node><node></node></root>
Processing:
0: <?xml version="1.0" encoding="UTF-8"?><node/>
------------------------------------------------
XML Input:
<root><node></node> <node></node></root>
Processing:
0: <?xml version="1.0" encoding="UTF-8"?><node/>
1: <?xml version="1.0" encoding="UTF-8"?><node/>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[-1,-1]
Message: found: END_DOCUMENT, expected START_ELEMENT or END_ELEMENT
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.nextTag(XMLStreamReaderImpl.java:1247)
at com.newedge.test.StAXTest.processXML(StAXTest.java:35)
at com.newedge.test.StAXTest.main(StAXTest.java:21)
------------------------------------------------
XML Input:
<root><node></node> <node></node> </root>
Processing:
0: <?xml version="1.0" encoding="UTF-8"?><node/>
1: <?xml version="1.0" encoding="UTF-8"?><node/>
------------------------------------------------