在过去的48小时里,我一直在打击这个绝对令人愤怒的小虫,所以我想在我把笔记本电脑扔到窗外之前,我终于放弃了,试着问问.
我正在尝试从我对AWS SimpleDB的调用中解析响应XML.电路上的反应很好; 例如,它可能看起来像:
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
Run Code Online (Sandbox Code Playgroud)
我将此XML传递给解析器
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
Run Code Online (Sandbox Code Playgroud)
并eventReader.nextEvent();
多次调用以获取我想要的数据.
这是一个奇怪的部分 - 它在本地服务器内运行良好.响应进来,我解析它,每个人都很开心.问题是,当我将代码部署到Google App Engine时,传出请求仍然有效,并且响应XML看起来100%完全相同且对我来说正确,但响应无法解析,但有以下异常:
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines …
Run Code Online (Sandbox Code Playgroud) 流式xml解析器(如SAX和StAX)比构建像DOM解析器这样的树结构的解析器更快,内存效率更高.SAX是一个推送解析器,意味着它是观察者模式的一个实例(也称为监听器模式).SAX首先存在,但随后出现了StAX - 一个拉解析器,意味着它基本上像迭代器一样工作.
你可以找到为什么在任何地方都喜欢StAX而不是SAX的原因,但它通常归结为:"它更容易使用".
在关于JAXP的Java教程中,StAX被模糊地呈现为DOM和SAX之间的中间:"它比SAX更容易,并且比DOM更高效".但是,我从来没有发现任何线索,StAX比SAX更慢或内存效率更低.
这一切让我想知道:有没有理由选择SAX而不是StAX?
在推送解析方法下,推送解析器在解析文档时生成同步事件,并且应用程序可以使用回调处理程序模型处理这些事件
这是关于SAX 2.0的Pro XML Development with Java一书中给出的文本.
至于StAX,这本书说:
在pull方法下,使用解析器在应用程序的控制下从XML文档中提取事件.
我想问一下,突出显示文本的含义是什么?一个适合初学者的答案表示赞赏:)
是否可以使用StAX(特别是woodstox)使用换行符和制表符格式化输出xml,即以下列形式:
<element1> <element2> someData </element2> </element1>
代替:
<element1><element2>someData</element2></element1>
如果在woodstox中无法做到这一点,是否有其他轻量级库可以做到这一点?
我正在使用Android studio 1.5.1
我想在我的android项目中包含org.apache.poi-ooxml库.要包含该库,我需要包含一些其他库依赖项,其中包括stax-api库.
stax api的问题在于它拥有javax中的所有包.*这是一个"核心库".Java jdk包含了所有这些库,所以如果我在Java SE中使用它,我就不需要那个stax-api库.另一方面,Android有一个"部分"stax-api库.对于android我只需要javax.xml.stream.*包.这意味着我需要提取stax-api,删除除javax.xml.stram包之外的所有内容,然后重新打包它.
所以我想在Android中使用这个修改过的库是安全的.但是,它有javax.*包,根据Android studio是一个核心库,所以Android Studio(或Android Studio中的任何组件)给我一个警告:
处理"javax/xml/stream/EventFilter.class"时遇到问题:
在不构建核心库时,不明智或错误地使用核心类(java.*或javax.*).
这通常是由于在使用IDE(例如Eclipse)时无意中在应用程序的项目中包含了核心库文件.如果你确定你不是故意定义一个核心类,那么这就是最可能的解释.
但是,您实际上可能正在尝试在核心命名空间中定义一个类,例如,您可能已从非Android虚拟机项目中获取该类.这肯定是行不通的.它至少会危害您的应用与该平台的未来版本的兼容性.它的合法性通常也是有问题的.
如果您真的打算构建一个核心库 - 它只适合作为创建完整虚拟机分发的一部分,而不是编译应用程序 - 那么使用"--core-library"选项来抑制此错误消息.
如果你继续使用"--core-library"但实际上正在构建一个应用程序,那么预先警告你的应用程序仍然无法构建或运行,在某些时候.请为愤怒的客户做好准备,例如,一旦升级操作系统,您的应用程序就会停止运行.你应该为这个问题负责.
如果您合法地使用恰好位于核心软件包中的某些代码,那么最简单的安全替代方法是重新打包该代码.也就是说,将有问题的类移动到您自己的包命名空间中.这意味着它们永远不会与核心系统类冲突.JarJar是一个可以帮助您完成这项工作的工具.如果你发现你不能做到这一点,那就表明你所走的道路最终会导致痛苦,痛苦,悲伤和悲伤.
所以,我想使用这个--core-library选项.但是在哪里设置呢?
我已经看过Android Studio忽略--core-library标志,这对我没有帮助.我认为这些答案已经过时,这就是为什么我要问一个新问题.
我做了什么尝试:
的build.gradle:
dexOptions {
coreLibrary true;
}
Run Code Online (Sandbox Code Playgroud)的build.gradle:
dexOptions {
preDexLibraries = false
}
project.tasks.withType(com.android.build.gradle.tasks.Dex) {
additionalParameters=['--core-library']
}
Run Code Online (Sandbox Code Playgroud)文件 - >其他设置 - >默认设置 - >编译器 - > Android编译器并检查'添加 - 核心库标志'
这些都没有奏效.有没有办法设置该选项?
编辑:为什么我需要STAX:
我正在做一些与Workbook,Sheet,Columns,Cells for .xlsx文件的东西.当我只包括poi-ooxml-3.14-beta1-20151223.jar
我在构建时间中得到一个错误说class file for org.apache.poi.ss.usermodel.Workbook not found
.
在运行时包含poi-3.14-beta1-20151223.jar后,我得到了Could not find method org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.isSetBookViews, referenced from …
我的快速搜索揭示了参考实现(http://stax.codehaus.org),Woodstox实现(http://woodstox.codehaus.org)和Sun的SJSXP实现(https://sjsxp.dev.java.net) /).
请评论这些的相对优点,并填写我应该考虑的任何其他实现.
我的Mac运行Java 1.5再次出现问题....我在哪里获得一个包含javax.xml.stream.XMLInputFactory的.jar文件?我想使用StAX但不知道如何正确设置它.
我似乎无法得到这个设置.我现在已经下载了jaxp-api.jar,jsr173_1.0_api.jar,sjsxp.jar,stax-api-1.0.1.jar,stax2-api-3.0.1.jar和woodstox-core-asl-4.0. 5.jar; 把它们全部放到我的java/lib/ext目录中,确保它们在我的eclipse构建路径上,删除了Mac com.apple.quarantine扩展属性,在.jar文件上做了一个"chmod a + x",然后我仍然会尝试以下错误import javax.xml.stream.XMLInputFactory;
访问限制:由于对所需库的限制而无法访问XMLInputFactory类型/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext/jsr173_1.0_api.jar
我需要做什么?
我有以下两个级别的XML
结构.一个框列表,每个框都包含一个抽屉列表.
<Boxes>
<Box id="0">
<Drawers>
<Drawer id="0"/>
<Drawer id="1"/>
...
</Drawers>
</Box>
<Box id="1">
...
</Box>
</Boxes>
Run Code Online (Sandbox Code Playgroud)
我正在解析它StAX
并通过两个暴露结构Iterators
:
BoxIterator implements Iterator<Box>, Iterable<Box>
Box implements Iterable<Drawer>
DrawerIterator implements Iterator<Drawer>
然后我可以做以下事情:
BoxIterator boxList;
for (Box box : boxList) {
for (Drawer drawer : box) {
drawer.getId()
}
}
Run Code Online (Sandbox Code Playgroud)
在Iterators
我正在使用的那些人的引擎盖下StAX
,他们两个都访问相同的底层XMLStreamReader
.如果我调用BoxIterator.next()
它将影响将在后续调用时返回的结果,DrawerIterator.next()
因为光标将移动到下一个框.
这会违反合同Iterator
吗?是否有更好的方法来迭代使用两级结构StAX
?
Is there a way I can use STAX parser to efficiently parse an XML document with multiple lists of objects of different classes (POJO). The exact structure of my XML is as follows (class names are not real)
<?xml version="1.0" encoding="utf-8"?>
<root>
<notes />
<category_alpha>
<list_a>
<class_a_object></class_a_object>
<class_a_object></class_a_object>
<class_a_object></class_a_object>
<class_a_object></class_a_object>
.
.
.
</list_a>
<list_b>
<class_b_object></class_b_object>
<class_b_object></class_b_object>
<class_b_object></class_b_object>
<class_b_object></class_b_object>
.
.
.
</list_b>
</category_alpha>
<category_beta>
<class_c_object></class_c_object>
<class_c_object></class_c_object>
<class_c_object></class_c_object>
<class_c_object></class_c_object>
<class_c_object></class_c_object>
.
.
.
.
.
</category_beta>
</root>
Run Code Online (Sandbox Code Playgroud)
I have been …
stax ×10
java ×9
xml ×8
parsing ×2
xml-parsing ×2
android ×1
apache-poi ×1
formatting ×1
iterator ×1
jaxb ×1
sax ×1
saxparser ×1
woodstox ×1