不带 @XMLRootElement 的 JAXB 部分解组元素

2024-02-29

我正在使用部分解组的例子JAXB,但我无法解组不在根级别的 XML 元素(因为它们没有 @XmlRootElement 标记)。在我的示例中,我尝试读取shipTo-Element而不是purchaseOrder-Element。

通常我会使用 JAXBElement unmarshal(Source source,ClassclarifiedType) 但由于该示例使用 UnmarshallerHandler 和 XMLFilterImpl 我不知道在哪里告诉 Jaxb 它应该使用哪个类。

我的错误消息是:引起:javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“shipTo”)。预期元素为 、、

我用谷歌搜索了很多,但还没有找到任何有用的东西。

以下是 JaxB 网页中的示例代码:

主程序.java

public class Main {
public static void main( String[] args ) throws Exception {

    // create JAXBContext for the primer.xsd
    JAXBContext context = JAXBContext.newInstance("primer");

    // create a new XML parser
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setNamespaceAware(true);
    XMLReader reader = factory.newSAXParser().getXMLReader();

    // prepare a Splitter
    Splitter splitter = new Splitter(context);

    // connect two components
    reader.setContentHandler(splitter);

    for( int i=0; i<args.length; i++ ) {
        // parse all the documents specified via the command line.
        // note that XMLReader expects an URL, not a file name.
        // so we need conversion.
        reader.parse(new File(args[i]).toURL().toExternalForm());
    }
}

}

分割器.java

public class Splitter extends XMLFilterImpl {

public Splitter( JAXBContext context ) {
    this.context = context;
}

/**
 * We will create unmarshallers from this context.
 */
private final JAXBContext context;


public void startElement(String namespaceURI, String localName, String qName, Attributes atts)
    throws SAXException {

    if( depth!= 0 ) {
        // we are in the middle of forwarding events.
        // continue to do so.
        depth++;
        super.startElement(namespaceURI, localName, qName, atts);
        return;
    }

    if( namespaceURI.equals("") && localName.equals("purchaseOrder") ) {
        // start a new unmarshaller
        Unmarshaller unmarshaller;
        try {
            unmarshaller = context.createUnmarshaller();
        } catch( JAXBException e ) {
            // there's no way to recover from this error.
            // we will abort the processing.
            throw new SAXException(e);
        }
        unmarshallerHandler = unmarshaller.getUnmarshallerHandler();

        // set it as the content handler so that it will receive
        // SAX events from now on.
        setContentHandler(unmarshallerHandler);

        // fire SAX events to emulate the start of a new document.
        unmarshallerHandler.startDocument();
        unmarshallerHandler.setDocumentLocator(locator);

        Enumeration e = namespaces.getPrefixes();
        while( e.hasMoreElements() ) {
            String prefix = (String)e.nextElement();
            String uri = namespaces.getURI(prefix);

            unmarshallerHandler.startPrefixMapping(prefix,uri);
        }
        String defaultURI = namespaces.getURI("");
        if( defaultURI!=null )
            unmarshallerHandler.startPrefixMapping("",defaultURI);

        super.startElement(namespaceURI, localName, qName, atts);

        // count the depth of elements and we will know when to stop.
        depth=1;
    }
}

public void endElement(String namespaceURI, String localName, String qName) throws SAXException {

    // forward this event
    super.endElement(namespaceURI, localName, qName);

    if( depth!=0 ) {
        depth--;
        if( depth==0 ) {
            // just finished sending one chunk.

            // emulate the end of a document.
            Enumeration e = namespaces.getPrefixes();
            while( e.hasMoreElements() ) {
                String prefix = (String)e.nextElement();
                unmarshallerHandler.endPrefixMapping(prefix);
            }
            String defaultURI = namespaces.getURI("");
            if( defaultURI!=null )
                unmarshallerHandler.endPrefixMapping("");
            unmarshallerHandler.endDocument();

            // stop forwarding events by setting a dummy handler.
            // XMLFilter doesn't accept null, so we have to give it something,
            // hence a DefaultHandler, which does nothing.
            setContentHandler(new DefaultHandler());

            // then retrieve the fully unmarshalled object
            try {
                JAXBElement<PurchaseOrderType> result = 
        (JAXBElement<PurchaseOrderType>)unmarshallerHandler.getResult();

                // process this new purchase order
                process(result.getValue());
            } catch( JAXBException je ) {
                // error was found during the unmarshalling.
                // you can either abort the processing by throwing a SAXException,
                // or you can continue processing by returning from this method.
                System.err.println("unable to process an order at line "+
                    locator.getLineNumber() );
                return;
            }

            unmarshallerHandler = null;
        }
    }
}

public void process( PurchaseOrderType order ) {
    System.out.println("this order will be shipped to "
        + order.getShipTo().getName() );
}

/**
 * Remembers the depth of the elements as we forward
 * SAX events to a JAXB unmarshaller.
 */
private int depth;

/**
 * Reference to the unmarshaller which is unmarshalling
 * an object.
 */
private UnmarshallerHandler unmarshallerHandler;


/**
 * Keeps a reference to the locator object so that we can later
 * pass it to a JAXB unmarshaller.
 */
private Locator locator;
public void setDocumentLocator(Locator locator) {
    super.setDocumentLocator(locator);
    this.locator = locator;
}


/**
 * Used to keep track of in-scope namespace bindings.
 * 
 * For JAXB unmarshaller to correctly unmarshal documents, it needs
 * to know all the effective namespace declarations.
 */
private NamespaceSupport namespaces = new NamespaceSupport();

public void startPrefixMapping(String prefix, String uri) throws SAXException {
    namespaces.pushContext();
    namespaces.declarePrefix(prefix,uri);

    super.startPrefixMapping(prefix, uri);
}

public void endPrefixMapping(String prefix) throws SAXException {
    namespaces.popContext();

    super.endPrefixMapping(prefix);
}

}

底漆.xsd

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:annotation>
    <xsd:documentation xml:lang="en">
      Purchase order schema for Example.com.
      Copyright 2000 Example.com. All rights reserved.
    </xsd:documentation>
  </xsd:annotation>


  <xsd:element name="purchaseOrders">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="purchaseOrder" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>


  <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>

  <xsd:element name="comment" type="xsd:string"/>

  <xsd:complexType name="PurchaseOrderType">
    <xsd:sequence>
      <xsd:element name="shipTo" type="USAddress"/>
      <xsd:element name="billTo" type="USAddress"/>
      <xsd:element ref="comment" minOccurs="0"/>
      <xsd:element name="items" type="Items"/>
    </xsd:sequence>
    <xsd:attribute name="orderDate" type="xsd:date"/>
  </xsd:complexType>

  <xsd:complexType name="USAddress">
    <xsd:sequence>
      <xsd:element name="name" type="xsd:string"/>
      <xsd:element name="street" type="xsd:string"/>
      <xsd:element name="city" type="xsd:string"/>
      <xsd:element name="state" type="xsd:string"/>
      <xsd:element name="zip" type="xsd:decimal"/>
    </xsd:sequence>
    <xsd:attribute name="country" type="xsd:NMTOKEN"
                   fixed="US"/>
  </xsd:complexType>

  <xsd:complexType name="Items">
    <xsd:sequence>
      <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="productName" type="xsd:string"/>
            <xsd:element name="quantity">
              <xsd:simpleType>
                <xsd:restriction base="xsd:positiveInteger">
                  <xsd:maxExclusive value="100"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:element>
            <xsd:element name="USPrice" type="xsd:decimal"/>
            <xsd:element ref="comment" minOccurs="0"/>
            <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
          </xsd:sequence>
          <xsd:attribute name="partNum" type="SKU" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>

  <!-- Stock Keeping Unit, a code for identifying products -->
  <xsd:simpleType name="SKU">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="\d{3}-[A-Z]{2}"/>
    </xsd:restriction>
  </xsd:simpleType>

</xsd:schema>

test.xml

<purchaseOrders>
      <!-- 1st -->
      <purchaseOrder orderDate="1999-10-20">
        <shipTo country="US">
          <name>Alice Smith</name>
          <street>123 Maple Street</street>
          <city>Cambridge</city>
          <state>MA</state>
          <zip>12345</zip>
        </shipTo>
        <billTo country="US">
          <name>Robert Smith</name>
          <street>8 Oak Avenue</street>
          <city>Cambridge</city>
          <state>MA</state>
          <zip>12345</zip>
        </billTo>
        <items/>
      </purchaseOrder>
    </purchaseOrders>

我有这个确切的问题;尝试使用 jaxb 参考实现中的部分解组示例。

我确定的解决方案是将自定义 com.sun.xml.bind.api.ClassResolver 添加到上面的 startElement 方法中创建的解组器中。看:

 try {
        unmarshaller = context.createUnmarshaller();
        unmarshaller.setProperty(ClassResolver.class.getName(), myClassResolver);
 } catch( JAXBException e ) {
...

这是一个模型解析器......

new ClassResolver()
    {
        @Override
        public Class<?> resolveElementName(String nsUri, String localName) throws Exception
        {
            if(MY_NAMESPACE.equals(nsUri) && MY_BAR.equals(localName))
                return BarType.class;
            else
                return null;
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不带 @XMLRootElement 的 JAXB 部分解组元素 的相关文章

  • Java - 因内存不足错误而关闭

    关于如何最好地处理这个问题 我听到了非常矛盾的事情 并且陷入了以下困境 OOME 会导致一个线程崩溃 但不会导致整个应用程序崩溃 我需要关闭整个应用程序 但不能 因为线程没有剩余内存 我一直认为最佳实践是让它们离开 这样 JVM 就会死掉
  • 使用 JDBC 获取 Oracle 11g 的最后插入 ID

    我是使用 Oracle 的新手 所以我将放弃之前已经回答过的内容这个问题 https stackoverflow com questions 3131064 get id of last inserted record in oracle
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有

随机推荐

  • 如何通过其值而不是位置设置微调器默认值?

    我的数据库中有 1 50 条记录 我使用游标获取这些数据 并使用简单游标适配器将这些值设置为 Spinner 现在我需要的是我想设置一个值 例如第 39 个值 作为默认值 但我不想通过它的位置来设置它的值 我知道如何通过其位置设置微调器默认
  • 在Centos 6.6 64位中安装pymssql

    我尝试在 Centos 6 6 中 pip install pymssql 但不断遇到此错误 mssql c 314 22 错误 sqlfront h 没有这样的文件或目录 cpp helpers h 34 19 错误 sybdb h 没有
  • 检测节点在场景中何时可见

    我正在尝试找到一种方法来检测 或接收通知 节点已添加到场景中并且可见 我正在主 JavaFx 线程中创建 Node 对象 并将它们添加到舞台和场景中 使用Platform runLater 但是 我希望 Node 对象接收已添加到场景中并且
  • Typescript:将 JSON 对象转换为类/接口对象

    我正在尝试将 API 响应转换为打字稿类 接口 这里 API 返回具有某些属性的对象列表 但我只需要响应对象的少数属性 API响应示例 Id 1 Name test Description Test PropertyX x Property
  • DNS 在 PHP 中不工作(但一般情况下可以)

    以下脚本 返回 DNS 记录列表 但最终在 file get contents 上失败 尽管 phpinfo 说 allow url fopen On On allow url include Off 出现以下错误 PHP 消息 PHP 警
  • 从 Numpy 中的多个切片中选择

    说我们有 a np ones 3 3 3 and slices 0 1 slice None 0 slice None 0 slice None 1 0 有没有一种简单的方法来选择 更改值a from slices 例如 我想分配0 to
  • 在 JSF 中向 selectOneMenu 添加“未选择任何内容”选项的最佳方法

    我想知道允许用户在 selectOneMenu 中不选择任何内容的最佳或最简单的方法是什么 我的示例 我有一个注册用户列表 管理员应该能够按某些条件过滤显示的用户列表 这些标准 例如用户类型 员工 客户 可以通过 selectOneMenu
  • Twitter bootstrap .popover 不工作

    我正在尝试让 Twitter Bootstrap 的 popover 工作 并且我几乎复制了我网站上的代码 但它告诉我 Object object object 在检查元素上没有方法 popover 我在 bootstrap tooltip
  • 根据另一列中的值创建新的指标列

    我有一些数据看起来像这样 import pandas as pd fruits apple pear peach df pd DataFrame col1 i want an apple i hate pears please buy a
  • PHP Doctrine 初学者:Doctrine\ORM\Tools\Setup 未找到

    我是教义的初学者 我刚刚安装了 pear 主义 2 3 3 并想测试它 为了测试教义 我写了一个名为 person 的类 Entity class person Id Column type integer GeneratedValue p
  • Scala:用于未来理解的 ExecutionContext

    当我做一个future 或应用类似的方法onSuccess and map 我可以为它们指定 ExecutionContext 例如 val f future code executionContext f map someFunction
  • 防止 pandoc 将 $ 转换为 mediawiki

    我正在使用 pandoc 将 markdown 文件转换为 mediawiki 表 文件内容mtcars md c1 c2 7 P A A 8 AB B 9 P A C 然后我就这样做了 我使用的是 Ubuntu 64 位和 pandoc
  • 在 Objective-C/cocoa 中抛出异常

    在 Objective C cocoa 中抛出异常的最佳方法是什么 I use NSException raise format 如下 NSException raise Invalid foo value format foo of d
  • 为什么我的 SVG 在 Polymer 组件内由 D3 渲染,没有样式?

    这里有一个Plunker我的问题的草图 http plnkr co 7hW5Rp71Qy1IwptZx4i6 相关代码 包含 Polymer 模板及其调用
  • Kendo UI 网格在调用读取后未填充

    好吧 我还有另一个 我确信我又错过了一些简单的东西 使用 json 结果集填充 Kendo 网格 加载是通过从剑道下拉列表控件中进行选择来触发的 我可以看到数据从我的 webapi 返回并转换为 json 结果 但数据未显示在网格中 我错过
  • 避免以编程方式启动使用创建的上下文的 HiveThriftServer2

    在 Spark 2 0 0 中 我们尝试使用 ThriftServer 从 Spark 临时表中查询数据 首先 我们创建了启用了 Hive 支持的 SparkSession 目前 我们使用 sqlContext 启动 ThriftServe
  • 轨道模型和独特的组合

    我有一个 Rails 应用程序 其中有一个名为friendrequests 它看起来像这样 user1 id integer user2 id integer hasaccepted boolean 我正在创建一个添加好友的选项 但好友请求
  • C++派生类型的自动工厂注册

    像我之前的许多人一样 我正在尝试让我的派生类型自动向我的工厂注册 我通读了很多问题 并试图专注于我在那里没有找到的问题 除了自动注册之外 一切都运行良好 我的目标 automatically register any derived cla
  • PHP语言规范中“[”怎么会是运算符呢?

    On the http php net manual en language operators precedence php http php net manual en language operators precedence php
  • 不带 @XMLRootElement 的 JAXB 部分解组元素

    我正在使用部分解组的例子JAXB 但我无法解组不在根级别的 XML 元素 因为它们没有 XmlRootElement 标记 在我的示例中 我尝试读取shipTo Element而不是purchaseOrder Element 通常我会使用