当前位置: 首页 > 面试题库 >

符号已定义。使用JAXB属性解决冲突

俞衡虑
2023-03-14
问题内容

我有一个xsd文件(yahoo.xsd),我在其中导入了另一个xsd文件,如下所示:

  <xs:import schemaLocation="stock.xsd"/>
  <xs:attribute name="lang" type="xs:NCName"/>

stock.xsd看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng">
<xs:import namespace="http://www.yahooapis.com/v1/base.rng" schemaLocation="yahoo.xsd"/>
<xs:element name="quote">
<xs:complexType>
  <xs:sequence>  
    <xs:element ref="Symbol"/>
  </xs:sequence>
  <xs:attribute name="symbol" use="required" type="xs:NCName"/>
</xs:complexType>
</xs:element>
<xs:element name="Symbol" type="xs:NCName"/>
</xs:schema>

当我使用xjc进行编译时,出现以下错误消息:

[错误]属性“符号”已经定义。使用 解决此冲突。

我基本上在SO上找到了解决此问题的方法(JAXB编译问题-[ERROR]属性“Any”已经定义),但是我无法使其正常工作。我猜我的XPath是错误的。

这是我正在使用的绑定文件:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
      xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      version="2.1">
<bindings schemaLocation="yahoo.xsd" version="1.0" >
    <!-- rename the value element -->
        <bindings node="//xs:element[@name='quote']/xs:complexType/xs:sequence/xs:element[@ref='Symbol']">
            <property name="SymbolAttribute"/>
    </bindings>
</bindings>

如果现在使用xjc -b进行编译,则表示XPath评估导致目标节点为空。

我可能必须重命名Symbol定义,然后再重命名ref?如何自动执行此操作?


问题答案:

让我问一下这一行:

<xs:element ref="Symbol"/>

是在yahoo.xsd中定义的符号,还是在同一xsd文件中本地定义的符号?

我将尝试推断一些事实。

我假设您有两个XSD:yahoo.xsdsome.xsd(您的帖子中的第一个)。我非常有信心在中定义“符号”类型,some.xsd而不是中定义yahoo.xsd。如果不是这样,我希望有一些名称空间前缀(“
yahoo:Symbol”?)。

现在,您的some.xsd看起来是否类似于此:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" >
    <!-- It's not important right now: -->
    <!--<xs:import namespace="http://www.yahooapis.com/v1/base.rng" schemaLocation="yahoo.xsd"/>-->

    <!-- declaration you omitted in your post, it's only example -->
    <xs:element name="Symbol">
        <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="0"/>
              <xs:maxInclusive value="100"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

    <xs:element name="quote">
        <xs:complexType>
          <xs:sequence>  
            <xs:element ref="Symbol"/>
          </xs:sequence>
          <xs:attribute name="symbol" use="required" type="xs:NCName"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

如果我说的是真的,那么您的jaxb绑定应如下所示:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
      xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      version="2.1">
    <bindings schemaLocation="some.xsd"> <!-- not yahoo.xsd -->
        <bindings node="//xs:element[@name='quote']/xs:complexType/xs:sequence/xs:element[@ref='Symbol']">
            <property name="SymbolAttribute" />
        </bindings>
    </bindings>

</bindings>

并生成的java类将是:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "symbolAttribute"
})
@XmlRootElement(name = "quote")
public class Quote {

    @XmlElement(name = "Symbol")
    protected int symbolAttribute;
    @XmlAttribute(name = "symbol", required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlSchemaType(name = "NCName")
    protected String symbol;
    ....


 类似资料:
  • 我有一个xsd文件(yahoo.xsd),我导入另一个xsd文件像这样: stock.xsd是这样的: 当我用xjc编译时,我得到了以下错误消息: 我基本上在这里找到了解决方案(JAXB编译问题-[ERROR]属性“Any”已经定义),但我无法让它工作。我猜我的XPath是错的。 这是我正在使用的绑定文件: 如果我现在使用xjc-b进行编译,它会说XPath计算会导致一个空的目标节点。 我可能需要

  • 问题内容: 使用JAXB生成XML绑定类。 该架构基于一组旧版XML文件,并包含以下代码段: ‘Value’属性与的’value’属性冲突,并且代码生成失败并显示以下错误: 问题答案: 答案在于利用JAXB绑定(): XPath表达式查找节点并重命名节点,从而避免了命名冲突。 使用此绑定XML文件,生成的Java类最终具有所需的(以及)。

  • 我有这个类结构来序列化TreeGrid(www.TreeGrid.com)对象: 数据网格.java 和 数据网格数据.java 这些类将被处理以返回XML结构,如下所示: 但是封装在B中的信息可能不同(因此在< code>DataGridData类中存在由同一个< code>XmlElement映射的两个属性)。 如果我在Java 7下运行我的项目,这一切都没问题,但是在Java 8下会引发一个

  • 问题内容: 联接操作可以正常工作,但是当我重用df2时,我面临着无法解析的属性错误 错误:org.apache.spark.sql.AnalysisException:已解析的属性ID#426 问题答案: 正如我在评论中提及,它关系到https://issues.apache.org/jira/browse/SPARK-10925,更具体地说https://issues.apache.org/ji

  • 当类使用具有相同属性的两个特征时,如何解决属性名称冲突? 示例: 提前道谢!

  • 我使用JAXB根据一些XSD模式生成java类。对于以下元素: <代码> jaxb生成以下代码: 问题是我们需要使用一些依赖于getter/setter方法命名约定的专有XML工具,例如,对于字段REC_LOC他们希望使用名为getRecLoc(String value)和setRecLoc()的方法,而不是getRECLOC()。 有没有办法自定义jaxb生成的方法名?