标签: stax

StAX - 使用XMLStreamWriter设置版本和编码

我使用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上运行这段代码.有谁知道如何设置版本和编码样式?

java xml encoding stax

7
推荐指数
2
解决办法
2万
查看次数

Android有任何StAX实现吗?

我想在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?

xml android stax xml-parsing

7
推荐指数
2
解决办法
4830
查看次数

如何使用StAX添加架构位置

我正在使用StAX,我想在我的xml文件中添加一个模式位置.实现这一目标的最佳方法是什么?

java xml stax

7
推荐指数
1
解决办法
3018
查看次数

Java:IndentingXMLStreamWriter替代?

我正在使用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

java xml stax indentation

7
推荐指数
3
解决办法
9170
查看次数

用Java转换StAX源代码

我有一些代码:

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

java stax xalan xml-parsing

7
推荐指数
1
解决办法
4815
查看次数

是否有一个很好的XML解析器用于光扫描XML文件以获取元素的字节偏移量?

我们有一个系统,我们正在处理XML文件,其中文件本身太大而无法放入内存中.

作为处理的一部分,我们希望快速扫描以记录相关元素的偏移量,以便稍后,我们可以立即查找这些元素并解析我们想要的部分(因为文件的较小片段将适合内存) ,我们可以负担得起使用DOM或其​​他任何部分.)

显然,我们可以从头开始编写自己的XML解析器,但在创建另一个XML解析器之前,我想看看是否还有其他可用选项.

以下是我们已经了解的事项列表.

  1. 使用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 xml parsing stax

7
推荐指数
1
解决办法
515
查看次数

Java 10 中的 javax.xml.stream 和 javax.xml.transform.stream

在 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 stax maven java-10

7
推荐指数
1
解决办法
1852
查看次数

XMLStreamReader和一个真正的流

更新 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流,并且不想将整个源文本加载到内存中.

谢谢你的帮助,尤里.

java xml streaming stax

6
推荐指数
1
解决办法
8484
查看次数

使用Transformer处理空CDATA时的IndexOutOfBoundsException

我想从大型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)

java xml stax

6
推荐指数
1
解决办法
598
查看次数

Java XMLStreamWriter:输出Unicode扩展字符(非BMP)

有谁知道如何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: …

java xml unicode stax

6
推荐指数
1
解决办法
1024
查看次数

标签 统计

stax ×10

java ×9

xml ×9

xml-parsing ×2

android ×1

encoding ×1

indentation ×1

java-10 ×1

maven ×1

parsing ×1

streaming ×1

unicode ×1

xalan ×1