2012-11-28 3 views
5

내가 JAXB가 XCCDF Schema LocationJAXB 컴파일 문제 - [ERROR] 속성 "모든"이미

에서 얻을 수있는 표준 스키마 나는 현재 오전 XCCDF - 1.1.4.xsd 바인딩을 만들려고하고 정의된다 EclipseLink MOXy를 JAXB 구현으로 사용하고 있기 때문에 JSON 바인딩도 생성 할 수 있다는 점이 마음에 든다. 나는 악명 높은 "[ERROR] 속성"값은 외부 바인딩 XML을 사용하여 오류를 "이미 정의되어 있습니다"공격 곳

나는 기회의 몇 고정, 지금은

[ERROR] Property "Any" is already defined. Use <jaxb:property> to resolve this conflict. 
line 441 of file:/home/dchu/Playground/Java/eclipselink_moxy/xccdf_1.1.4/xccdf-1.1.4.xsd 

[ERROR] The following location is relevant to the above error 
line 444 of file:/home/dchu/Playground/Java/eclipselink_moxy/xccdf_1.1.4/xccdf-1.1.4.xs 

이 아래는에 오류를 타격하고 오류가 발생한 XML 스키마의 행 스 니펫.

<xsd:sequence> 
    <xsd:choice minOccurs="1" maxOccurs="1"> 
     <xsd:any namespace="http://purl.org/dc/elements/1.1/" 
       minOccurs="1" maxOccurs="unbounded"/> 
     <xsd:any namespace="http://checklists.nist.gov/sccf/0.1" 
       processContents="skip" 
       minOccurs="1" maxOccurs="unbounded"/> 
    </xsd:choice> 
</xsd:sequence> 

여기서 무엇이 잘못 될 수 있는지 아는 사람이 있습니까? 감사!

답변

11

외부 바인딩 파일을 사용하여 any 속성 중 하나의 이름을 바꿀 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns="http://www.example.org/schema" 
    elementFormDefault="qualified"> 

    <xsd:complexType name="foo"> 
     <xsd:sequence> 
      <xsd:choice minOccurs="1" maxOccurs="1"> 
       <xsd:any namespace="" 
        minOccurs="1" maxOccurs="unbounded" /> 
       <xsd:any namespace="http://checklists.nist.gov/sccf/0.1" 
        processContents="skip" minOccurs="1" maxOccurs="unbounded" /> 
      </xsd:choice> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 

XJC 전화 :

binding.xml

<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> 

    <jxb:bindings schemaLocation="schema.xsd"> 
     <jxb:bindings 
      node="//xsd:complexType[@name='foo']/xsd:sequence/xsd:choice/xsd:any[@namespace='http://checklists.nist.gov/sccf/0.1']"> 
      <jxb:property name="any2" /> 
     </jxb:bindings> 
    </jxb:bindings> 

</jxb:bindings> 

XML 스키마 (schema.xsd) 아래

은 XML 스키마의 단순화 된 버전입니다

다음은 외부 바인딩 파일을 활용하는 XJC 호출 방법입니다. 바인딩 JAXB를 생성하는 JAVA JAXB 구현을 사용하는 경우 일 것 JAXB 외부 바인딩 XML을 생성하는 블 레즈의 제안을 사용

클래스 (푸)를 생성
xjc -b binding.xml schema.xsd 

package org.example.schema; 

import java.util.*; 
import javax.xml.bind.annotation.*; 
import org.w3c.dom.Element; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "foo", propOrder = { 
    "any", 
    "any2" 
}) 
public class Foo { 

    @XmlAnyElement(lax = true) 
    protected List<Object> any; 
    @XmlAnyElement 
    protected List<Element> any2; 


    public List<Object> getAny() { 
     if (any == null) { 
      any = new ArrayList<Object>(); 
     } 
     return this.any; 
    } 

    public List<Element> getAny2() { 
     if (any2 == null) { 
      any2 = new ArrayList<Element>(); 
     } 
     return this.any2; 
    } 

} 
1

.

그러나 EclipseLink MOXy jaxb-compiler.sh를 사용할 때는 작동하지 않습니다. Blaise는 컴파일러 스크립트에서 발생할 수있는 버그 일 수 있다고 말했다. bug ticket 395328

현재이 문제의 해결 방법은 JDK에서 JAVA XJC 명령을 사용하고 생성 된 디렉토리에 jaxb.properties 파일을 수동으로 추가하는 것입니다. Specifying-eclipselink-moxy-as-yours