我正在尝试为xccdf-1.1.4.xsd创建JAXB绑定,这是一个可以从XCCDF Schema Location
获取的标准模式我目前正在使用EclipseLink MOXy作为我的JAXB实现,因为我喜欢它也可以生成JSON绑定。
我修复了几次使用外部绑定XML命中臭名昭着的“[ERROR]属性”值“已定义”错误,现在我遇到了错误
[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>
有谁知道这里有什么问题?谢谢!
答案 0 :(得分:12)
您可以使用外部绑定文件重命名任何属性之一。
<强> 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架构的简化版本:
<?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致电
下面是如何进行利用外部绑定文件的XJC调用。
xjc -b binding.xml schema.xsd
生成的类(Foo)
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 :(得分:1)
使用Blaise建议创建JAXB外部绑定XML在使用JAVA JAXB实现生成JAXB绑定时会起作用。
但是在使用EclipseLink MOXy jaxb-compiler.sh时它不起作用。 Blaise说它可能是编译器脚本中可能存在的错误。 bug ticket 395328
此问题的解决方法是使用JDK中的JAVA XJC命令并在生成的目录中手动添加jaxb.properties文件。 Specifying-eclipselink-moxy-as-yours
答案 2 :(得分:0)
当我使用Eclipse时,我尝试了所有这些解决方案,但它们确实对我没有帮助。因此,我切换到了Netbeans,它确实给了我同样的错误,只是一个对话框显示或多或少的相同错误消息,但细节较少。
这是最重要的部分,Netbeans会创建客户端服务!是的,并显示错误消息。
您可以按照以下步骤创建Web服务客户端:
1.右键单击该项目,
2.全新
3. Web服务客户端
4.选择WSDL URL并粘贴URL
5.单击完成,然后创建带有错误的客户端。
因此,我将生成的WSDL文件放在我的项目中,在文件中搜索“ any”的出现,并在同一标签中每秒钟对文件中的出现进行注释。
在同一标签中所有第二次出现的注释后,保存文件。右键单击Web Service(首先展开Web Services References),然后单击Refresh。而且,只需拖放方法并使用您的参数调用它们,您的Web服务客户端就可以很好地运行!
对我有用...