在过去的48小时里,我一直在对付这个绝对令人愤怒的虫子,所以我想我最终会扔在毛巾上,在我把笔记本电脑从窗户里扔出去之前,先试着问这里。 我试图从我对AWS SimpleDB的调用中parsing响应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> 我将这个XML传递给parsing器 XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent()); 并调用eventReader.nextEvent(); 一堆时间来获得我想要的数据。 这是奇怪的部分 – 它在本地服务器内部工作得很好。 回答来了,我parsing,大家都很开心。 问题是,当我将代码部署到Google App Engine时,传出的请求仍然有效,并且响应XML似乎与我完全相同且正确,但响应无法parsing,但出现以下exception: com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1] Message: Content is not allowed in prolog.): <?xml […]
像SAX和StAX这样的stream式xmlparsing器比构build像DOMparsing器这样的树结构的parsing器更快,更有效。 SAX是一个推式parsing器,这意味着它是观察者模式的一个实例(也称为侦听器模式)。 SAX先在那里,但后来又到了StAX–一个拉parsing器,这意味着它基本上像迭代器一样工作。 您可以find为什么StAX比SAX更喜欢SAX的原因,但通常归结为:“使用更简单”。 在JAXP的Java教程中,StAX被隐约地表述为DOM和SAX之间的中间部分:“比SAX更容易,比DOM更高效”。 但是,我从来没有发现任何StAX比SAX更慢或更less内存效率的线索。 所有这些让我怀疑: 有什么理由selectSAX而不是StAX?
我有程序需要parsing包含字符实体的XML。 程序本身并不需要让它们解决,而且它们的列表很大,并且会改变,所以我想避免对这些实体的明确的支持。 这是一个简单的例子: <?xml version="1.0" encoding="UTF-8"?> <xml>Hello there &something;</xml> 是否有一个Java XML API可以parsing文档而不parsing(非标准)字符实体? 理想情况下,它会把它们转化为一个特殊的事件或对象,可以专门处理,但我会find一个select,会默默地压制他们。 答案和例子: Skaffman给了我答案:使用IS_REPLACING_ENTITY_REFERENCES设置为false的StAXparsing器。 这里是我鞭打试验的代码: XMLInputFactory inputFactory = XMLInputFactory.newInstance(); inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); XMLEventReader reader = inputFactory.createXMLEventReader( new FileInputStream("your file here")); while (reader.hasNext()) { XMLEvent event = reader.nextEvent(); if (event.isEntityReference()) { EntityReference ref = (EntityReference) event; System.out.println("Entity Reference: " + ref.getName()); } } 对于上面的XML,它将打印“ Entity Reference: […]