JAXB从anyType访问String内容

时间:2016-06-29 08:17:10

标签: java xml xsd jaxb xjc

我有一个预定义的xsd架构(不幸的是我无法修改),我喜欢通过JAXB生成相应的JAVA类。目前我正在努力解决一个复杂类型,其定义如下。

var expressions = new []
{
    "test test test test totalamount(32604) > 0m)",
    "test test test test totalamount(32604, 13456) > 0m)",
    "test test test test minamount(32604) > 0m)",
    "test test test test minamount(32604, 34677, 12345) > 0m)"
};


var numbers = new Regex(@"(total|min)amount\(([\d,\s]+)\)");

foreach (var expression in expressions)
    Console.WriteLine(numbers.Match(expression).Groups[2]);

提供的XML示例允许直接字符串内容,如下所示:

  <xsd:complexType name="AttributeType">
    <xsd:complexContent>
      <xsd:extension base="xsd:anyType">
        <xsd:attribute name="id" type="xsd:anyURI" use="required"/>
        <xsd:anyAttribute processContents="lax"/>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

以及这样的嵌入式xml:

<attribute id="myValue">201</attribute>

当运行xjc进程而没有进一步的绑定修改时,我得到一个这样的类:

<attribute id="address">
    <example:Address xmlns:example="http://example.com/ns">
        <Street>100 Nowhere Street</Street>
        <City>Fancy</City>
        <State>DC</State>
        <Zip>99999</Zip>
    </example:Address>
</attribute>

问题是,我无法获得第一个示例的字符串内容。这可能会引用XSD anytype and JAXB,但实际上我并不知道如何在不修改XSD的情况下实现此目的。那么我怎样才能获得字符串内容?顺便说一句。我使用maven cxf-codegen-plugin来生成源代码。

1 个答案:

答案 0 :(得分:0)

我认为问题来自于生成的映射查找子元素而不是文本。

如果您可以修改XSD,解决方案将是:

<xsd:complexType name="AttributeType">
    <xsd:complexContent mixed="true">
      <xsd:extension base="xsd:anyType">
       <xsd:attribute name="id" type="xsd:anyURI" use="required"/>
       <xsd:anyAttribute processContents="lax"/>
      </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

但是因为你不能......

如果您有能力修改源代码,请更改:

@XmlAnyElement
protected List<Element> any;

@XmlAnyElement
@XmlMixed
protected List<Object> any;

对象列表应包含子元素Element和文本String