2010-10-29 91 views
7

XJC似乎完全忽略了我的XML Schema元素上的mixed="true",因此不允許我提取文本內容。從下面的示例XML中,我需要能夠提取「標題文本」。如果沒有mixed="true"得到認可,沒有訪問創建也不是從XML解組:JAXB XJC編譯器忽略XML模式文檔中的mixed = true

<?xml version="1.0" encoding="UTF-8"?> 
<title xmlns="urn:hl7-org:v3" integrityCheck="true">Title Text</title> 

以下是一個演示的問題的完整而最小化的模式:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<xs:schema targetNamespace="urn:hl7-org:v3" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="urn:hl7-org:v3" 
    xmlns:mif="urn:hl7-org:v3/mif" 
    elementFormDefault="qualified"> 

    <xs:complexType name="ST" mixed="true"> 
    <xs:complexContent> 
     <xs:restriction base="ED"> 
      <xs:sequence> 
       <xs:element name="reference" type="xs:string" minOccurs="0" maxOccurs="0"/> 
       <xs:element name="thumbnail" type="xs:string" minOccurs="0" maxOccurs="0"/> 
      </xs:sequence> 
      <xs:attribute name="compression" type="xs:string" use="prohibited"/> 
     </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="ED" mixed="true"> 
    <xs:complexContent> 
     <xs:extension base="BIN"> 
     <xs:sequence> 
      <xs:element name="reference" type="xs:string" minOccurs="0" maxOccurs="1" /> 
      <xs:element name="thumbnail" minOccurs="0" maxOccurs="1" type="xs:string" /> 
      </xs:sequence> 
     <xs:attribute name="compression" type="xs:string" use="optional" /> 
     <xs:attribute name="integrityCheck" type="xs:string" use="optional" /> 
     <xs:attribute name="integrityCheckAlgorithm" type="xs:string" use="optional" default="SHA-1" /> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="BIN" abstract="true" mixed="true"> 
    <xs:complexContent> 
     <xs:extension base="ANY"> 
     <xs:attribute name="representation" use="optional" type="xs:string" default="TXT" /> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="ANY" abstract="true"> 
    <xs:attribute name="nullFlavor" type="xs:string" use="optional" /> 
    </xs:complexType> 

    <xs:element name="title" type="ST" /> 
</xs:schema> 

注意,在上面我已經混合= 「真正」。儘管如此,生成的模式片段不包含對它的引用,也不會生成的類使用XmlMixed註解,也不是一個值或內容訪問:

/** 
* <p>Java class for ST complex type. 
* 
* <p>The following schema fragment specifies the expected content contained within this class.                                    
* 
* <pre> 
* <complexType name="ST"> 
* <complexContent> 
*  <restriction base="{urn:hl7-org:v3}ED"> 
*  <sequence> 
*   <element name="reference" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="0" minOccurs="0"/> 
*   <element name="thumbnail" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="0" minOccurs="0"/> 
*  </sequence> 
*  </restriction> 
* </complexContent> 
* </complexType> 
* </pre> 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "ST") 
public class ST 
    extends ED 
{ 
} 

爲什麼XJC/JAXB完全無視我的混合內容字段?我已經嘗試了JAXB 2.1和JAXB 2.2,但生成的代碼中只有微不足道的差異。

注意:由於實際架構是符合標準的醫療保健(HL7)架構,因此無法更改架構。

+0

BIN類是什麼樣的? – 2010-10-29 13:27:29

+0

@Blaise - 我現在已經包含了一個小而完整的模式來演示這個問題。 – 2010-10-29 17:21:40

+0

有沒有找到解決這個問題的辦法?我面對同一個。我不得不編輯生成的類(BIN)。 – AHungerArtist 2011-06-14 20:00:51

回答

5

經過更多的研究,我無能爲力,但得出結論,這是我提交的一個錯誤。它被公認爲JAXB issue #792

+0

「這是一個錯誤」似乎是一個有效的迴應。爲什麼downvotes? – 2012-08-15 15:03:51

4

http://blogs.oracle.com/mgrebac/entry/handling_extended_mixed_content_in

這工作!只要創建一個綁定文件,像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0" 
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc"> 
    <jaxb:globalBindings generateMixedExtensions="true"/> 
</jaxb:bindings> 

然後使用-b參數與你平時做的方式在命令行上。

+0

我記得當時看到那篇文章,IIRC,我的問題稍有不同,但有關。但是......我再也不能確切地記得。 – 2011-06-14 20:17:19

+0

它確實創建了一個內容字段,不幸的是它是一個醜陋的List ,但這比沒有它更好,尤其是因爲我也在使用HL7模式。事實上,這是我遇到的同一班。 – AHungerArtist 2011-06-14 21:18:28

2

年過去了,但這個計劃讓人煩惱不已!過去幾天我一直在用這個相同的XSD(HL7),尤其是處理混合內容元素類型。

我最初的需求是原始海報的反面,因爲我需要在混合元素內編寫簡單的文本。但是我必須能夠閱讀這樣的內容,所以我應用了另一個回覆中提出的同樣的解決方案,即創建一個自定義綁定文件,並在Eclipse的「架構中的JAXB類」嚮導中使用它。 在這種情況下,您可以專門選擇在嚮導的某個對話框中使用哪個綁定文件。

因此,只要找到混合元素類型,就會生成類別爲List<Serializable>的內容。提取您實際需要的單一信息會有點棘手,但至少您確信您可以通過編程訪問存在於遵循該XSD的XML文件中的任何內容。

甚至可以導航到更復雜的混合的內容如:

<v3:name> 
    <v3:given>Sample Given Name</v3:given> 
    <v3:family>Sample Family Name</v3:family> 
</v3:name> 

name被定義爲這樣的(I除去用於從原始XSD該示例中不實用的內容):

<xs:complexType name="EN" mixed="true"> 
    <xs:complexContent> 
     <xs:sequence> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
       <xs:element name="delimiter" type="en.delimiter"/> 
       <xs:element name="family" type="en.family"/> 
       <xs:element name="given" type="en.given"/> 
       <xs:element name="prefix" type="en.prefix"/> 
       <xs:element name="suffix" type="en.suffix"/> 
      </xs:choice> 
     </xs:sequence> 
    </xs:complexContent> 
</xs:complexType> 

類型en.familyen.given等都混合在一起(並且爲了我們的目的,我們不需要知道其他任何東西)。

所以,當你訪問的名字的內容,其List<Serializable>將組成:

  1. 一個String,是<v3:name><v3:given>
  2. EnGiven元素
  3. 一個String之間的空白,是空白在</v3:given><v3:family>之間
  4. EnFamily元件
  5. 一個String,是</v3:family></v3:name>

EnGivenEnFamily的內容之間的空白將各由單String的,分別爲‘樣品賜名’和‘樣本姓’。再次,這有點棘手,你可能不得不放置一些邏輯來處理特定的情況,但你可以這樣管理它。

順便說一句,填充元素很簡單:只需將字符串添加到所需的List<Serializable>內容。