我目前正在尝试读取XML文件,进行一些小的更改(更改某些属性的值),然后再将其写回.
我打算使用StAX解析器(javax.xml.stream.XMLStreamReader
)读取每个事件,看看它是否是我想要更改的,然后javax.xml.stream.XMLStreamReader
如果不需要更改则直接传递给StAX writer().
不幸的是,这看起来并不那么简单 - 作者无法获取事件类型和解析器对象,只有像writeAttribute
和的方法writeStartElement
.很显然,我可以用一个可以在XML文档中出现的每种可能类型的元素的大小写一个大的switch语句,然后再把它写回来,但是看起来它应该很简单似乎很麻烦.
是否有一些我缺少的东西可以很容易地将一个非常相似的XML文档写入您使用StAX读取的文档?
这是我第一次使用StAX解析XML文档(仍处于学习阶段).在使用XMLStreamReader解析XML文档并使用XMLStreamWriter生成文档副本的过程中,我遇到了以下警告,该警告在writer的输出中表示为注释:
<!-- Exception scanning External DTD Subset. True contents of DTD cannot be determined. Processing will continue as XMLInputFactory.IS_VALIDATING == false. -->
Run Code Online (Sandbox Code Playgroud)
我理解警告的原因,但我希望它成为一个错误,而不是默默地成为一个警告,所以然后我尝试将XMLInputFactory.IS_VALIDATING设置为true:
XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)
但上面对我提出了一个例外:
线程"main"中的异常java.lang.IllegalArgumentException:com.sun.org中的com.sun.org.apache.xerces.internal.impl.PropertyManager.setProperty(PropertyManager.java:150)不支持isValidating的true值. com.test.test.helper.Test.main中的com.test.test2.helper.SgmlDocumentParser.parse(SgmlDocumentParser.java:83)中的internal.stream.XMLInputFactoryImpl.setProperty(XMLInputFactoryImpl.java:257)(Test.java: 66)
那我的方法出了什么问题呢?
谢谢!
我在类路径中有一个woodstox和java SE 1.6 stax解析器,但woodstox似乎默认被选中.但是在某些情况下我想使用默认的Java stax解析器.有没有办法指定使用哪个实现?
应该是容易和明显但我无法找到一种方式 - XMLOutputFactory
接受anly OutputStream
,Result
或另一种方式Writer
来生成新的XMLStreamWriter
.
我手边的东西是XMLStreamReader
没有提取a Result
或a的方法OutputStream
.
如果使用Event API更容易解决方案,那也没关系.
谢谢
我试图将一些代码从使用DOM(通过jDOM)转换为使用StAX.与此同时,我正在从基于DTD的验证迁移到基于XSD的验证.哦,只是为了好的措施,我将JAXB引入等式:)
无论如何,作为临时迁移步骤,我想允许用户仍然提供遗留文档(也就是说,使用DTD,因此没有命名空间).我仍然会使用XSD验证文档,因此忽略了DTD.除了StAX(也不是JAXB)似乎不喜欢非命名空间的文档之外,这是有效的.我尝试禁用名称空间支持(使用javax.xml.stream.isNamespaceAware),但这没有任何效果.明确地将xmlns添加到文档根目录修复了问题,因此我相当确定它是一个命名空间问题.
有没有办法使用StAX XMLEventReader"引入"默认命名空间?这种方法的某些方面(特定于SAX),但对于StAX ......
或者关于如何实现这一目标的任何其他想法?
示例文档如下所示:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.test.abstractembeddedcomponents.cid">
...
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
我目前用来阅读这些文件的代码是:
public JaxbRoot unmarshal(InputStream stream, Origin origin) {
try {
XMLEventReader staxReader = staxFactory().createXMLEventReader( stream );
try {
return unmarshal( staxReader, origin );
}
finally {
try {
staxReader.close();
}
catch ( Exception ignore ) {
}
}
}
catch ( XMLStreamException e ) {
throw new MappingException( "Unable to create stax reader", e, origin …
Run Code Online (Sandbox Code Playgroud) 我正在寻找最新的,内存效率和高性能的Java XML解析API.我需要解析3 MB到5 MB的XML文件.
我对此进行了谷歌搜索并了解了Sun Java Streaming XML Parser(SJSXP),而Woodstox比DOM和SAX快得多.两者都使用StAX API.*这些技术不支持架构验证.
Aalto XML处理器也实现了StAX API.
我没有找到关于这些技术的性能的具体发现.
哪一个在内存高效,高性能和易用性方面最佳?
我有一些小的XML块,应该作为子元素嵌入到一个大的XML中.有没有办法在XMLStreamWriter
没有逃避它们的情况下编写这些块?
在对应用程序进行性能分析时,我注意到一遍又一遍地创建XMLInputFactory实例非常昂贵。在多个线程之间共享其实例是否安全?
Javadoc没有任何关于其线程安全性的信息,并且在互联网上搜索并不能给出明确的答案!
我有一个XML模式。我在Stax上写了一层薄薄的文字,以允许“即时”生成符合条件的文档(我不需要类似dom的API,我需要的空间很小/没有空间)。该API具有如下方法:
writeCar(String manufacturer)
writeWheels(String manufacturer, boolean winter)
...
Run Code Online (Sandbox Code Playgroud)
它们执行状态检查,然后调用适当的stax方法。
一个特殊之处是没有writeEndXXX方法(我的架构是明确的,因此您无法在wheel元素内放置任何汽车。这意味着我总是知道何时关闭打开的元素)。唯一的例外是,有一个flush()将写入所有未决的结束标记。
writeCar(..) // <car>
writeWheels(..) // inside the car <wheels>
writeCar(..) // close the pending tags </wheels></car> and new car <car>
flush() // this writes all pending close tags
Run Code Online (Sandbox Code Playgroud)
这很好。现在,模式发展了:)
我现在正在手动更新API。因为我很道德,所以我真的不想这样做:)。给定XML模式定义后,是否有可用的工具可以生成此类API(或类似的API)?
我想获取xml文件的属性值而不知道它的索引,因为属性在xml文件中的多个元素中重复.
这是我的xml文件
<fields>
<form name="userAdditionFrom">
</form>
</fields>
Run Code Online (Sandbox Code Playgroud)
这是proccing文件
case XMLEvent.ATTRIBUTE:
//how can i know the index of attribute?
String attName = xmlReader.getAttributeValue(?????);
break;
Run Code Online (Sandbox Code Playgroud)
提前.
阿拉