我使用StAX创建XML文件,然后使用和XSD验证文件.
我在创建XML文件时遇到错误:
javax.xml.stream.XMLStreamException: Underlying stream encoding 'Cp1252' and input paramter for writeStartDocument() method 'UTF-8' do not match.
at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeStartDocument(XMLStreamWriterImpl.java:1182)
Run Code Online (Sandbox Code Playgroud)
这是代码片段:
XMLOutputFactory xof = XMLOutputFactory.newInstance();
try{
XMLStreamWriter xtw = xof.createXMLStreamWriter(new FileWriter(fileName));
xtw.writeStartDocument("UTF-8","1.0");} catch(XMLStreamException e) {
e.printStackTrace();
} catch(IOException ie) {
ie.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我在Unix上运行这段代码.有谁知道如何设置版本和编码样式?
我想在Android 1.6及更高版本的设备中使用StAX API实现.那里有没有实现?我不能直接使用jar文件,因为它给出了关于内部类的问题.如果它不可用,有什么办法可以重新编译实现吗?是否有另一种方法可以将POJO类直接映射到XML,反之亦然,请排除SAX解析器和DOM解析器.
我认为使用JAXB可以将POJO类映射到XML,反之亦然.但情况是这样的.考虑这个例子,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cars>
<car registration="abc123">
<brand>BMW</brand>
<description>Sedan</description>
</car>
<car registration="abc123">
<brand>Ferrari</brand>
<description>SportsCar</description>
</car>
</cars>
Run Code Online (Sandbox Code Playgroud)
现在结果我想要List中有2辆车.
另外JAXB解析器如何对抗StAX?
我正在使用StAX创建一个非常大的xml文档.到目前为止,我使用IndentingXMLStreamwriter类来获取格式良好的文档(另请参阅此答案).几天前,我们设置了一个jenkins服务器,它有一个较旧的jdk版本(6.26),我得到了构建错误.
package com.sun.xml.internal.txw2.output does not exist
Run Code Online (Sandbox Code Playgroud)
我认为由于安装了jdk版本,无法找到包.由于不同的原因,这不能改变(顺便说一下,有没有人知道jdk版本,这个包(com.sun.xml.internal.txw2.output)被添加了?).
因此,我正在寻找缩进的替代方案.我更喜欢类似于我使用的解决方案,这意味着无需重新分析文档.任何想法或建议?
谢谢
Lars
我有一些代码:
XMLInputFactory xif = XMLInputFactory.newInstance()
TransformerFactory tf = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl", null)
Transformer t = tf.newTransformer()
DOMResult result = new DOMResult()
t.transform(new StAXSource(reader), result)
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
抓到:javax.xml.transform.TransformerException:无法转换类型为javax.xml.transform.stax.StAXSource的Source
读者对象属于类型 com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl
我们有一个系统,我们正在处理XML文件,其中文件本身太大而无法放入内存中.
作为处理的一部分,我们希望快速扫描以记录相关元素的偏移量,以便稍后,我们可以立即查找这些元素并解析我们想要的部分(因为文件的较小片段将适合内存) ,我们可以负担得起使用DOM或其他任何部分.)
显然,我们可以从头开始编写自己的XML解析器,但在创建另一个XML解析器之前,我想看看是否还有其他可用选项.
以下是我们已经了解的事项列表.
使用StAX应该可以工作,但不能.这是一个演示.我做了一个XML示例,其中有超过一个字节的字符,以证明一旦开始传递这些字符,返回的字节偏移量就不正确.请注意,即使API中的方法名为getCharacterOffset(),文档也会说如果传入字节流,它会返回字节偏移量 - 这就是此代码正在执行的操作.
@Test
public void testByteOffsetsFromStreamParser() throws Exception {
// byte counts are size required for UTF-8, I checked using Ishida's tool.
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<root>\n"
" <leaf>\u305A\u308C\u306A\u3044\u3067\u307B\u3057\u3044</leaf>\n" +
" <leaf>\u305A\u308C\u306A\u3044\u3067\u307B\u3057\u3044</leaf>\n" +
" <leaf>\u305A\u308C\u306A\u3044\u3067\u307B\u3057\u3044</leaf>\n" +
"</root>\n";
byte[] xmlBytes = xml.getBytes("UTF-8");
assertThat(xmlBytes.length, is(equalTo(171))); // = 171 from above
String implToTest = "com.sun.xml.internal.stream.XMLInputFactoryImpl";
//String implToTest = "com.ctc.wstx.stax.WstxInputFactory";
XMLInputFactory factory =
Class.forName(implToTest).asSubclass(XMLInputFactory.class).newInstance();
factory.setProperty("javax.xml.stream.isCoalescing", false);
factory.setProperty("javax.xml.stream.supportDTD", false);
XMLEventReader reader = factory.createXMLEventReader(
new ByteArrayInputStream(xmlBytes));
try { …
Run Code Online (Sandbox Code Playgroud)在 Java 8 中,我一直在使用这些包:
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stream.StreamSource;
Run Code Online (Sandbox Code Playgroud)
现在,在 Java 10 中,它们无法解决。我应该包含哪些 Maven 依赖项?我不想使用模块。
解决方案:
从旧库中排除旧的 Maven 依赖项 stax-api 和 xml-apis。
更新 Java社区中没有现成的XML解析器可以进行NIO和XML解析.这是我发现的最接近的,它是不完整的:http://wiki.fasterxml.com/AaltoHome
我有以下代码:
InputStream input = ...;
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(input, "UTF-8");
Run Code Online (Sandbox Code Playgroud)
问题是,为什么方法#createXMLStreamReader()希望在输入流中有一个完整的XML文档?为什么它被称为"流阅读器",如果它似乎无法处理XML数据的一部分?例如,如果我喂:
<root>
<child>
Run Code Online (Sandbox Code Playgroud)
它会告诉我,我错过了结束标签.甚至在我开始迭代流阅读器本身之前.我怀疑我只是不知道如何正确使用XMLStreamReader.我应该可以按件提供数据,对吗?我需要它,因为我正在处理来自网络套接字的XML流,并且不想将整个源文本加载到内存中.
谢谢你的帮助,尤里.
我想从大型XML文件中提取特定节点.这很有效,直到出现没有任何内容的狂野CDATA.
输出:
ERROR: ''
javax.xml.transform.TransformerException: java.lang.IndexOutOfBoundsException
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:732)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)
at xml_test.XML_Test.extractXML2(XML_Test.java:698)
at xml_test.XML_Test.main(XML_Test.java:811)
Caused by: java.lang.IndexOutOfBoundsException
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.getTextCharacters(XMLStreamReaderImpl.java:1143)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.handleCharacters(StAXStream2SAX.java:261)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.bridge(StAXStream2SAX.java:171)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.parse(StAXStream2SAX.java:120)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:674)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:723)
... 3 more
---------
java.lang.IndexOutOfBoundsException
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.getTextCharacters(XMLStreamReaderImpl.java:1143)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.handleCharacters(StAXStream2SAX.java:261)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.bridge(StAXStream2SAX.java:171)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXStream2SAX.parse(StAXStream2SAX.java:120)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:674)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:723)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)
at xml_test.XML_Test.extractXML2(XML_Test.java:698)
at xml_test.XML_Test.main(XML_Test.java:811)
Run Code Online (Sandbox Code Playgroud)
代码:
InputStream stream = new FileInputStream("C:\\myFile.xml");
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(stream);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
String extractPath = "/root";
String path …
Run Code Online (Sandbox Code Playgroud) 有谁知道如何char
使用Java的XMLStreamWriter 正确输出扩展字符(非BMP,超过1 )?例如,尝试输出Unicode U + 10480 :
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
public class XmlStreamWriterExtendedCharactersFail {
public static void main(String[] args) throws XMLStreamException {
String inlineStr = "inlineStr = ";
// create string using StringBuilder to avoid Java file encoding confusion:
String sbStr = new StringBuilder("sbStr = ").appendCodePoint(0x10480).toString();
assert sbStr.equals(inlineStr);
System.out.println(sbStr);
OutputStreamWriter outWriter = new OutputStreamWriter(System.out,
StandardCharsets.UTF_8.newEncoder());
XMLStreamWriter writer = XMLOutputFactory.newFactory()
.createXMLStreamWriter(outWriter);
writer.writeStartDocument("UTF-8", "1.1");
writer.writeStartElement("el");
writer.writeCharacters(sbStr);
writer.writeEndElement();
writer.writeEndDocument();
writer.close();
}
}
Run Code Online (Sandbox Code Playgroud)
results in: …