【问题标题】:JAXB DTD scheme generation conflictJAXB DTD 方案生成冲突
【发布时间】:2017-01-26 02:51:41
【问题描述】:

我在TradeMessage.dtd 文件中有一个 DTD 架构(这是最小的工作示例)

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT BpsaMessage (BuyMessage | SellMessage)>
<!ATTLIST BpsaMessage
    unique_id CDATA #REQUIRED
>
<!ELEMENT BuyMessage (account)>
<!ATTLIST BuyMessage
    db_apply CDATA #REQUIRED
>
<!ELEMENT account EMPTY>
<!ATTLIST account
    client_nbr CDATA #REQUIRED
>
<!ELEMENT SellMessage (account)>
<!ATTLIST SellMessage
    db_apply CDATA #REQUIRED
>
<!ELEMENT account EMPTY>
<!ATTLIST account
    action CDATA #REQUIRED
>

并尝试使用该命令为其生成一组Java类

xjc -dtd -d result_folder -p org.company.model TradeMessages.dtd

很遗憾,我遇到了错误

parsing a schema...
[ERROR] Element "account" was already declared
  line 18 of file:/C:/Dev/Programs/Java/jdk1.8.0_60/bin/TradeMessage.dtd

Failed to parse a schema.

问题:

  1. 如何将SellMessage 中的account 元素重命名为例如sellAccountxjc 绑定文件用于解决此名称冲突?

  2. 如何自定义绑定以将BuyMessage 类放入org.company.model.buySellMessage 类放入org.company.model.sell 单独的包中?

  3. 是否可以指定绑定以省略TradeMessage.dtd 中除BpsaMessageSellMessageBuyMessage 之外的任何其他DTD 模式声明?

【问题讨论】:

  • DTD 中不能有重复的元素声明。如果您愿意在对象中使用冗余字段,则可以将这两个属性作为 #IMPLIED 添加到单个定义中,或者您可以改用 xsd。
  • @teppic 实际上这不是我的 DTD。它是来自独立系统的 DTD,它向我们发送 XML 消息。我无法更改或修复它。但是我需要为 JAXB XML unmarshaller 生成一组 Java 类。

标签: java jaxb xjc dtd xml


【解决方案1】:

您提供的 DTD 已损坏,无法使用 xjc 的配置来解决它。 xjc 无法读取架构,因为account 有多个定义。

您不必使用相同的 DTD 来生成 bean - 您可以使用经过编辑的副本。 JAXB 在解组期间不引用模式,所以重要的是用于生成 bean 的模式与输入 XML 的结构相匹配。

这是一个固定的 DTD:

<!ELEMENT BpsaMessage (BuyMessage | SellMessage)>
<!ATTLIST BpsaMessage unique_id CDATA #REQUIRED>
<!ELEMENT BuyMessage (account)>
<!ATTLIST BuyMessage db_apply CDATA #REQUIRED>
<!ELEMENT account EMPTY>
<!ATTLIST
    account client_nbr CDATA #IMPLIED
    account action CDATA #IMPLIED
>
<!ELEMENT SellMessage (account)>
<!ATTLIST SellMessage db_apply CDATA #REQUIRED>

这是一个匹配的 XSD:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="BpsaMessage">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="message" type="Message"/>
            </xsd:sequence>
            <xsd:attribute type="xsd:string" name="unique_id"/>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="Message" abstract="true">
        <xsd:attribute name="db_apply" type="xsd:string" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="BuyMessage">
        <xsd:complexContent>
            <xsd:extension base="Message">
                <xsd:sequence>
                    <xsd:element name="account">
                        <xsd:complexType>
                            <xsd:attribute name="client_nbr" type="xsd:string" use="required"/>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="SellMessage">
        <xsd:complexContent>
            <xsd:extension base="Message">
                <xsd:sequence>
                    <xsd:element name="account">
                        <xsd:complexType>
                            <xsd:attribute name="action" type="xsd:string" use="required"/>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:schema>

【讨论】:

  • 是的,很清楚如何创建 Java POJO。但我不想手动执行此操作,因为将来会更新源 DTD。
  • 这个世界上没有什么能说服 xjc 解析那个 DTD。您必须让提供商修复它。
猜你喜欢
  • 1970-01-01
  • 2013-04-29
  • 2021-10-12
  • 2011-02-17
  • 2016-09-24
  • 2012-05-05
  • 2019-12-24
  • 1970-01-01
  • 2013-03-07
相关资源
最近更新 更多