xml看起来像这样:
<statements>
<statement account="123">
...stuff...
</statement>
<statement account="456">
...stuff...
</statement>
</statements>
Run Code Online (Sandbox Code Playgroud)
我正在使用stax一次处理一个" <statement>
",然后我就开始工作了.我需要将整个语句节点作为字符串获取,这样我就可以创建"123.xml"和"456.xml",甚至可以将其加载到由account索引的数据库表中.
使用这种方法:http://www.devx.com/Java/Article/30298/1954
我想做这样的事情:
String statementXml = staxXmlReader.getNodeByName("statement");
//load statementXml into database
Run Code Online (Sandbox Code Playgroud) 我试图在Java中合并两个xmls.我正在使用STaX API来编写这些XML.我在互联网上搜索了很多关于如何合并xmls的内容,但似乎没有像C#那样直截了当.使用StAX在Java中有没有直接的方法?可能xslt不是正确的解决方案,因为文件大小可能很大.
File1.xml
<TestCaseBlock>
<TestCase TestCaseID="1">
<Step ExecutionTime="2011-03-29 12:08:31 EST">
<Status>Passed</Status>
<Description>foo</Description>
<Expected>foo should pass</Expected>
<Actual>foo passed</Actual>
</Step>
</TestCase>
</TestCaseBlock>
Run Code Online (Sandbox Code Playgroud)
File2.xml
<TestCaseBlock>
<TestCase TestCaseID="2">
<Step ExecutionTime="2011-03-29 12:08:32 EST">
<Status>Failed</Status>
<Description>test something</Description>
<Expected>something expected</Expected>
<Actual>not as expected</Actual>
</Step>
</TestCase>
</TestCaseBlock>
Run Code Online (Sandbox Code Playgroud)
Merged.xml
<TestCaseBlock>
<TestCase TestCaseID="1">
<Step ExecutionTime="2011-03-29 12:08:33 EST">
<Status>Passed</Status>
<Description>foo</Description>
<Expected>foo should pass</Expected>
<Actual>foo passed</Actual>
</Step>
</TestCase>
<TestCase TestCaseID="2">
<Step ExecutionTime="2011-03-29 12:08:34 EST">
<Status>Failed</Status>
<Description>test something</Description>
<Expected>something expected</Expected>
<Actual>not as expected</Actual>
</Step>
</TestCase>
</TestCaseBlock>
Run Code Online (Sandbox Code Playgroud) 我尝试使用StAX XML解析器解析XML文件.它给了我START_ELEMENT
和END_DOCUMENT
事件,但没有ATTRIBUTE
事件.如何ATTRIBUTE
使用StAX解析器接收事件?
我的XML:
<?xml version="1.0" encoding="utf-8"?>
<posts>
<row name="Jonas"/>
<row name="John"/>
</posts>
Run Code Online (Sandbox Code Playgroud)
我的StAX XML解析器:
public class XMLParser {
public void parseFile(String filename) {
XMLInputFactory2 xmlif = (XMLInputFactory2) XMLInputFactory2.newInstance();
xmlif.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.FALSE);
xmlif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
xmlif.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
xmlif.configureForSpeed();
XMLStreamReader2 xmlr = (XMLStreamReader2)
xmlif.createXMLStreamReader(new FileInputStream(filename));
int eventType;
while(xmlr.hasNext()) {
eventType = xmlr.next();
switch(eventType) {
case XMLStreamConstants.START_ELEMENT:
if(xmlr.getName().toString().equals("row")) {
System.out.println("row");
}
break;
case XMLStreamConstants.ATTRIBUTE:
System.out.println("Attribute");
break;
case XMLStreamConstants.END_DOCUMENT:
System.out.println("END");
xmlr.close();
break;
}
}
}
public static void …
Run Code Online (Sandbox Code Playgroud) 我正在使用woodstox为XML文件实现StAX解析器.假设我的文件系统中的公共目录中有一个匹配DTD的有效XML文件.
/path/to/test.xml
/path/to/test.dtd
Run Code Online (Sandbox Code Playgroud)
XML使用相对系统标识符声明引用其DTD,如下所示:
<!DOCTYPE test SYSTEM "test.dtd">
Run Code Online (Sandbox Code Playgroud)
从验证的角度来看,一切似乎都很好.(是吗?xmllint不会抱怨.)但是,当我尝试使用下面的代码解析文件时,woodstox会抛出java.io.FileNotFoundException,因为它无法找到相对的DTD文件.在我看来,实现尝试相对于工作目录而不是相对于XML文件对象访问DTD文件.
import java.io.FileInputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
public class Test {
public static void main( String[] args ) throws Exception {
FileInputStream fileInputStream = new FileInputStream( args[0] );
XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
XMLStreamReader xsr = xmlInputFactory.createXMLStreamReader(fileInputStream);
while( xsr.hasNext() ) {
if( xsr.next() == XMLStreamConstants.DTD ) {
System.err.println( xsr.getText() );
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
writer.writeStartElement(startElement.getName().getLocalPart());
Run Code Online (Sandbox Code Playgroud)
//当我在具有一个线程的独立计算机上运行时,它工作正常,但是当我在服务器上运行多个线程的多个作业时,它会给我以下错误:
writer.writeStartElement(startElement.getName().getLocalPart());
javax.xml.stream.XMLStreamException: Trying to output second root, <element>
ERROR [STDERR] (JBossQuartzScheduler_Worker-4) javax.xml.stream.XMLStreamException:
Trying to output second root, <handset>
ERROR [STDERR] (JBossQuartzScheduler_Worker-4) at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1473)
ERROR [STDERR] (JBossQuartzScheduler_Worker-4) at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1480)
ERROR [STDERR] (JBossQuartzScheduler_Worker-4) at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1508)
ERROR [STDERR] (JBossQuartzScheduler_Worker-4) at com.ctc.wstx.sw.BaseNsStreamWriter.checkStartElement(BaseNsStreamWriter.java:444)
ERROR [STDERR] (JBossQuartzScheduler_Worker-4) at com.ctc.wstx.sw.BaseNsStreamWriter.writeStartElement(BaseNsStreamWriter.java:292)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用在Java 6中添加的newFactory()
方法XMLOutputFactory
.但是Eclipse保持标记newFactory()
为类型的未定义XMLOutputFactory
.JRE7是安装的唯一运行时,位于新Java项目的构建路径中.该项目本身只有JRE7(JRE系统库)和Ivy设置.我一直得到的错误是
The method newFactory() is undefined for the type XMLOutputFactory
Run Code Online (Sandbox Code Playgroud)
任何想法如何让Eclipse接受newFactory
?几乎只是return XMLOutputFactory.newFactory()
用作调用函数的唯一地方.
所以这个问题与标题中所述的差不多。我正在做一些 xml 工作并使用 XMLEventWriter。我遇到的大问题是我需要创建一些自关闭标签
问题是我还没有想出用 eventWriter 来做到这一点的方法。我已经尝试了所有我能想到的使用 XMLEventFactory 的方法,但似乎没有任何效果。任何帮助将不胜感激。
我正在尝试使用 StAX API 中的 XMLEventWriter 从头开始编写 XML 文档。
我不知道如何获取要发出的默认名称空间属性。
例如,默认命名空间 URI 字符串为“ http://www.liquibase.org/xml/ns/dbchangelog/1.9 ”。我希望它以 xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9" 的形式出现在我的 XML 根元素中。
这里有什么神奇的配方?XMLEventWriter.setDefaultNamespace() 不起作用。
谢谢,莱尔德
我正在使用 StAX 使用XMLStreamWriter
.
但是,我的文档的某些部分很难一一调用 XMLStreamWriter 的方法,使用 DOM 构造一个小的文档片段,然后将其写出会更容易。
我知道如何使用 DOM,但这是我的问题:有没有一种简单的方法来获取一个Element
对象并将其写出到XMLStreamWriter
?
我大概可以弄清楚如何“连接”这两种方法,但这似乎很乏味,而且应该已经有了一些东西。(走另一条路似乎微不足道:http : //blogs.oracle.com/venu/entry/constructing_dom_using_stax_writers)
我有一个纯粹通过在 TomEE 7 环境中运行的注释配置的 JAX-WS Web 服务端点。基本上,被调用的方法必须返回一个List<String>
包含在图形数据结构中的所有节点名称。此类请求的响应可以包含更多感谢 50k 元素。
With CXF 2.6.x this worked fine. However, when I call the WS-method under CXF 3.x (bundled in TomEE 7.x), the following exception is thrown on the server side:
org.apache.cxf.interceptor.Fault: Unmarshalling Error: Maximum Number of Child Elements limit (50000) Exceeded
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:906)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:712)
at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:179)
at org.apache.cxf.wsdl.interceptors.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1680)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1559)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1356)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:653)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) …
Run Code Online (Sandbox Code Playgroud)