看起来GAE选择了JDK 1.6类的子集,如下所示:
这是非常不幸的,因为人们会在最常见的java库中获得类链接错误,这些java库处理数据绑定,反射,类加载和注释.虽然有些遗漏可能是针对已弃用或遗留的东西,但还有一些遗漏不是.我特别关注的是流式拉解析器(javax.xml.stream.*),它经过长时间的延迟(API与JDK 1.4大致同时完成)后刚刚添加到JDK 1.6中.省略这一点使得进行可扩展的高性能xml处理变得更加困难.
我理解的问题是,不仅缺少类,而且由于安全性限制,甚至无法添加它们.
所以:这是一个开放式的哲学问题,可能只是GAE开发人员可以肯定回答但是......为什么有些API从标准的JDK 1.6中掉线,看似随意?
更新:
快速说明:感谢您的回答.对于它的价值我真的不知道安全性与不包括javax.xml.stream有什么关系.安全方面与许多其他事情相关(例如,我不需要线程,并且可以看出它们为什么会出局),所以这是可以理解的样板答案; 只是不适用于这个.
Stax API只是一组接口和摘要,用于大声喊叫.但更重要的是,它与SAX,DOM和JAXP接口具有完全相同的分支 - 已经包括在内!
但看起来这个问题已引起谷歌开发者的关注:
所以这里希望能够迅速解决这个问题和类似问题.
我遇到了两个用于解析文件的不同代码StAX.一个快速的谷歌搜索告诉我,有两种方法可以解析:使用游标API和使用迭代器API.请告诉我两者之间的区别,从开发人员的角度来看哪一个更容易使用.
家伙.
我花了很多时间试图了解这是一个错误还是我自己缺乏教育.基本上,我正在尝试对特定元素做出反应,并使用Java StAX API使用Transformer读取其内容.
当XML格式相当或元素之间有空格时,一切都有效.但是,只要它看到XML在元素之间没有空白字符,它就会严重破坏.
有代码及其输出来说明问题.
有3个示例XML,前2个显示2个不同的中断场景,而最后一个显示正确的处理:
在没有空格的第一个场景中,它会跳过一些元素.在下面的示例中,它跳过除一个"node"元素之外的所有元素.在现实世界中,它会跳过其他每个节点.可能是因为节点内容更丰富.
在第二个场景中,我仅在节点元素之间添加了空格.如您所见,它无法正确处理文档的结尾.
在上一个场景中,我在最后一个节点和关闭根元素之间添加了空格.处理按需要进行.
在我的真实世界场景中,我期望单行无分隔符XML,因此我需要方案1正常工作,并且也很高兴知道对XML的有效更改(例如在元素之间添加空格)不会破坏处理比如场景2.
请帮忙!!!
完整的单类应用程序测试代码.StAXTest:
package test;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;
public class StAXTest {
private final static String XML1 = "<root><node></node><node></node></root>";
private final static String XML2 = "<root><node></node> <node></node></root>";
private final static String XML3 = "<root><node></node> <node></node> </root>";
public static void main(String[] args) throws Exception {
processXML(XML1);
processXML(XML2);
processXML(XML3);
}
private static void processXML(String xml) {
try …Run Code Online (Sandbox Code Playgroud) 所以我试图解析一个xml并将其解组成一个程序.这是xml的示例:
<MaintenanceTransaction:provideCommunicationEvents_BatchRequest
xmlns:MaintenanceTransaction="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MaintenanceTransaction:maintenanceTransaction>
<MaintenanceTransaction:eventInitiatedBy>
<MaintenanceTransaction:identifier>FINACLE</MaintenanceTransaction:identifier>
</MaintenanceTransaction:eventInitiatedBy>
<MaintenanceTransaction:transactionDate>2014-06-21T19:00:32.356+01:00</MaintenanceTransaction:transactionDate>
<MaintenanceTransaction:maintenanceTransactionType>PRE-NOTIFICATION
</MaintenanceTransaction:maintenanceTransactionType>
<MaintenanceTransaction:maintenanceEntries>
<MaintenanceTransaction:hasNewValues xsi:type="MaintenanceTransaction:DepositArrangement">
<MaintenanceTransaction:enterpriseId xsi:type="MaintenanceTransaction:ArrangementIdentifier">
<MaintenanceTransaction:identifier>222000000322</MaintenanceTransaction:identifier>
<MaintenanceTransaction:enterpriseIdType>Term Deposit</MaintenanceTransaction:enterpriseIdType>
</MaintenanceTransaction:enterpriseId>
<MaintenanceTransaction:maturityDate>2014-10-08</MaintenanceTransaction:maturityDate>
</MaintenanceTransaction:hasNewValues>
</MaintenanceTransaction:maintenanceEntries>
</MaintenanceTransaction:maintenanceTransaction>
</MaintenanceTransaction:provideCommunicationEvents_BatchRequest>
Run Code Online (Sandbox Code Playgroud)
xsd定义为:
<xsd:schema xmlns:MaintenanceTransaction="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02" elementFormDefault="qualified" attributeFormDefault="qualified">
<xsd:include schemaLocation="./commonIFWxsd/IFWXML.xsd" />
<xsd:include schemaLocation="./commonIFWxsd/Event.xsd" />
<xsd:include schemaLocation="./commonIFWxsd/Arrangement.xsd" />
<!-- end of TYPES REQUIRED FOR PARAMETERS -->
<xsd:complexType name="provideCommunicationEvents_BatchRequest">
<xsd:sequence>
<xsd:element name="maintenanceTransaction" type="MaintenanceTransaction:MaintenanceTransaction" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<!-- TYPES REQUIRED FOR PARAMETERS -->
<xsd:element name="provideCommunicationEvents_BatchRequest" type="MaintenanceTransaction:provideCommunicationEvents_BatchRequest" />
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)
使用我的StaxEventItemReader和Jaxb2Marshaller的以下设置:
<bean id="uploadEventMessageReader" parent="abstractUploadEventMessageReader" scope="step">
<property name="resource" value="file:#{jobExecutionContext['fileToProcess']}"/>
<property name="fragmentRootElementName" …Run Code Online (Sandbox Code Playgroud) 我正在使用XMLStreamWriter编写一个xml.但我不需要序言.
<?xml version="1.0" ?>
Run Code Online (Sandbox Code Playgroud)
如何在输出xml中省略此行.
有没有一种方法可以使用StAX和JAX-B创建索引,然后快速访问XML文件?
我有一个很大的XML文件,需要在其中查找信息。这是在桌面应用程序中使用的,因此它应在具有少量RAM的系统上工作。
所以我的想法是这样的:创建索引,然后快速从大文件访问数据。
我不能只分割文件,因为它是我想不更改地使用的官方联邦数据库。
使用XMLStreamReader,我可以快速找到一些元素,然后使用JAXB解组该元素。
final XMLStreamReader r = xf.createXMLStreamReader(filename, new FileInputStream(filename));
final JAXBContext ucontext = JAXBContext.newInstance(Foo.class);
final Unmarshaller unmarshaller = ucontext.createUnmarshaller();
r.nextTag();
while (r.hasNext()) {
final int eventType = r.next();
if (eventType == XMLStreamConstants.START_ELEMENT && r.getLocalName().equals("foo")
&& Long.parseLong(r.getAttributeValue(null, "bla")) == bla
) {
// JAX-B works just fine:
final JAXBElement<Foo> foo = unmarshaller.unmarshal(r,Foo.class);
System.out.println(foo.getValue().getName());
// But how do I get the offset?
// cache.put(r.getAttributeValue(null, "id"), r.getCursor()); // ???
break;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我无法得到补偿。我想用它来准备一个索引:
(id of element) -> (offset in file) …
我在http://stax.codehaus.org/上使用vrsion 1.2.0中的StAX Streaming Api .当我尝试将以下xml写入文件时,不会转义大于char的字符.然而,似乎没有逃脱的问题.
out = new FileOutputStream("foo.xml");
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter(out);
writer.writeStartDocument();
writer.writeStartElement("foo");
writer.writeAttribute("test", "<foo>");
writer.writeEndElement();
writer.writeEndDocument();
writer.flush();
writer.close();
out.close();
Run Code Online (Sandbox Code Playgroud)
输出(仅相关)是这样的:
<foo test="<foo>"
Run Code Online (Sandbox Code Playgroud)
我也试过使用writeCharacters方法 - 结果相同.这是一个错误还是意图?有没有解决方法?(手动更换>
replaceAll(">", ">");
Run Code Online (Sandbox Code Playgroud)
导致'&'自行逃脱.
在此先感谢您的帮助.
我试图测量StAX和DOM创建两个相同文档所需的时间.我不知道为什么DOM在创建XML方面更快.也许我的StAX编写器代码不是很好.所以这里是StAX(更长的代码)
public static final int pocet =100000;
try {
String encoding = "UTF-8";
XMLOutputFactory f = XMLOutputFactory.newInstance();
XMLStreamWriter w = f.createXMLStreamWriter(
new FileOutputStream(subor),
encoding);
w.writeStartDocument(encoding, "1.0");
w.writeCharacters("\r\n");
w.writeStartElement("Noviny");
for (int i = 1; i <= pocet; i++) {
w.writeCharacters("\r\n ");
w.writeStartElement("Autor");
w.writeCharacters("\r\n ");
w.writeStartElement("Id");
String ID = Integer.toString(i);
w.writeCharacters(ID);
w.writeEndElement();
w.writeCharacters("\r\n ");
w.writeStartElement("Meno");
w.writeCharacters("Autor"+i);
w.writeEndElement();
w.writeCharacters("\r\n ");
w.writeStartElement("Email");
w.writeCharacters("Autor"+i+"@email.com");
w.writeEndElement();
w.writeCharacters("\r\n ");
w.writeStartElement("Tel_cislo");
w.writeAttribute("typ", "pevna");
w.writeCharacters("+4219");
w.writeEndElement();
w.writeCharacters("\r\n ");
w.writeStartElement("plat");
w.writeCharacters("5000");
w.writeEndElement();
w.writeCharacters("\r\n ");
w.writeEndElement();
w.writeCharacters("\r\n");
}
w.writeCharacters("\r\n");
w.writeEndElement();
w.writeCharacters("\r\n"); …Run Code Online (Sandbox Code Playgroud) 我正在使用Apache Tomcat开发RSS feed聚合器.我想知道使用哪个解析器来读取RSS源.我应该使用DOM,SAX还是StAX?我知道有一些特定的库可以用java阅读RSS源,但由于这是一个大学项目,我不应该使用它们.谢谢.
我有以下问题:
原始RSS文件的一部分:
<item>
<title> I can get data in tag this </title>
<description><p> i don't get data in this </p></description></item>
Run Code Online (Sandbox Code Playgroud)
当我使用StAX解析器读取文件时,特殊字符'< ;; .它会自动转换为"<".然后我无法在标签"<'description>'的其余部分获取数据
这是我的代码:
public Feed readFeed() {
Feed feed = null;
try {
boolean isFeedHeader = true;
String description = "";
String title = "";
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
InputStream in = read();
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
String localPart = event.asStartElement().getName()
.getLocalPart();
switch (localPart) {
case "title":
title = …Run Code Online (Sandbox Code Playgroud)