标签: stax

Google App Engine背后的逻辑(如果有),不包括标准的JDK 1.6 API

看起来GAE选择了JDK 1.6类的子集,如下所示:

Google App Engine JDK白名单

这是非常不幸的,因为人们会在最常见的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的讨论

所以这里希望能够迅速解决这个问题和类似问题.

java google-app-engine stax jdk1.6

3
推荐指数
1
解决办法
663
查看次数

StAX Cursor API和Iterator API有什么区别?

我遇到了两个用于解析文件的不同代码StAX.一个快速的谷歌搜索告诉我,有两种方法可以解析:使用游标API和使用迭代器API.请告诉我两者之间的区别,从开发人员的角度来看哪一个更容易使用.

java xml stax

3
推荐指数
1
解决办法
3002
查看次数

Java StAX解析器无法解析有效的xml

家伙.

我花了很多时间试图了解这是一个错误还是我自己缺乏教育.基本上,我正在尝试对特定元素做出反应,并使用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)

java stax xml-parsing

3
推荐指数
1
解决办法
8508
查看次数

StaxEventItemReader中的Jaxb2Marshaller导致UnmarshalException

所以我试图解析一个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)

stax jaxb spring-batch

3
推荐指数
2
解决办法
1857
查看次数

XMLStreamWriter删除prolog

我正在使用XMLStreamWriter编写一个xml.但我不需要序言.

<?xml version="1.0" ?>
Run Code Online (Sandbox Code Playgroud)

如何在输出xml中省略此行.

java xml stax

3
推荐指数
1
解决办法
674
查看次数

使用StAX为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) …

java xml stax jaxb random-access

3
推荐指数
1
解决办法
815
查看次数

StAX逃逸大于(>)

我在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="&lt;foo>"
Run Code Online (Sandbox Code Playgroud)

我也试过使用writeCharacters方法 - 结果相同.这是一个错误还是意图?有没有解决方法?(手动更换>

replaceAll(">", "&gt;");
Run Code Online (Sandbox Code Playgroud)

导致'&'自行逃脱.

在此先感谢您的帮助.

java xml stax

2
推荐指数
1
解决办法
1220
查看次数

为什么StAX创建XML比DOM慢?

我试图测量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)

java testing stax dom

2
推荐指数
1
解决办法
1615
查看次数

Java:解析XML文件:DOM,SAX还是StAX?

我正在使用Apache Tomcat开发RSS feed聚合器.我想知道使用哪个解析器来读取RSS源.我应该使用DOM,SAX还是StAX?我知道有一些特定的库可以用java阅读RSS源,但由于这是一个大学项目,我不应该使用它们.谢谢.

java xml stax dom sax

2
推荐指数
1
解决办法
2万
查看次数

解析xml stax文件中的特殊字符

我有以下问题:

原始RSS文件的一部分:

  <item>
      <title> I can get data in tag this </title>
      <description>&lt;p&gt; i don't get data in this &lt;/p&gt;</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)

java parsing stax

2
推荐指数
1
解决办法
845
查看次数