Java 如何使用ApacheXMLBeans从Xsd模式中读取Xsd注释?
我使用ApacheXMLBeans读取xsd模式文件,从根元素开始迭代所有SchemaProperties。 在每个SchemaProperty中,我都在寻找注释:SchemaProperty.getType().getAnnotation(),但我找不到任何注释。(下面是java代码) 例如,我检查以下xsd文件: xsd结构图: Xsd源代码:Java 如何使用ApacheXMLBeans从Xsd模式中读取Xsd注释?,java,xsd,xmlbeans,Java,Xsd,Xmlbeans,我使用ApacheXMLBeans读取xsd模式文件,从根元素开始迭代所有SchemaProperties。 在每个SchemaProperty中,我都在寻找注释:SchemaProperty.getType().getAnnotation(),但我找不到任何注释。(下面是java代码) 例如,我检查以下xsd文件: xsd结构图: Xsd源代码: ExterneDaten的注释 ExterneDaten类型的注释 value1的注释 布尔属性isTest的注释 我用我的函数检查xsd:
ExterneDaten的注释
ExterneDaten类型的注释
value1的注释
布尔属性isTest的注释
我用我的函数检查xsd:MyXsdReader.readAllAnnotationsFromXsd(字符串模式)
以下是java代码:
public class MyXsdReader
{
public static void readAllAnnotationsFromXsd(String newSchema)
{
try
{
SchemaTypeLoader loader = XmlBeans.typeLoaderForClassLoader(SchemaDocument.class.getClassLoader());
XmlObject[] xmlObjects = new XmlObject[1];
XmlOptions options = new XmlOptions();
options.setLoadLineNumbers().setLoadMessageDigest().setCharacterEncoding("utf-8");
options.setCompileDownloadUrls();
xmlObjects[0] = loader.parse(newSchema, null, options);
SchemaTypeSystem sts = XmlBeans.compileXsd(xmlObjects, XmlBeans.getBuiltinTypeSystem(), options);
readXsdRootElement(sts);
}
catch (Exception e)
{
System.out.println("makeXsdListRootEle(): Excpetion: " + e.getMessage());
}
}
private static void readXsdRootElement(SchemaTypeSystem sts)
{
SchemaGlobalElement[] globals = sts.globalElements();
if (globals != null && globals.length == 1)
{
SchemaGlobalElement sge = globals[0];
SchemaType st = sge.getType();
SchemaProperty[] properties = st.getProperties();
for (int k = 0; k < properties.length; k++)
{
SchemaProperty property = properties[k];
checkAnnotation(property);
if (property.isAttribute() == false)
{
readXsdProperty(property);
}
}
}
}
private static void readXsdProperty(SchemaProperty property)
{
SchemaProperty[] properties = property.getType().getProperties();
for (SchemaProperty schemaProperty : properties)
{
checkAnnotation(schemaProperty);
readXsdProperty(schemaProperty);
}
}
private static void checkAnnotation(SchemaProperty schemaProperty)
{
SchemaAnnotation annotation = schemaProperty.getType().getAnnotation();
if (annotation != null)
{
System.out.println(annotation.toString());
}
}
}
公共类myxsr
{
公共静态void readAllAnnotationsFromXsd(字符串newSchema)
{
尝试
{
SchemaTypeLoader=XmlBeans.typeLoaderForClassLoader(SchemaDocument.class.getClassLoader());
XmlObject[]xmlObjects=新的XmlObject[1];
XmlOptions=新的XmlOptions();
options.setLoadLineNumber().setLoadMessageDigest().setCharacterEncoding(“utf-8”);
options.setCompiledDownloadUrls();
xmlObjects[0]=loader.parse(newSchema,null,options);
SchemaTypeSystem sts=XmlBeans.compileXsd(xmlObjects,XmlBeans.getbuiltypesystem(),options);
远程医疗(sts);
}
捕获(例外e)
{
System.out.println(“makeXsdListRootEle():expetion:”+e.getMessage());
}
}
私有静态void readXsdRootElement(SchemaTypeSystem sts)
{
SchemaGlobalElement[]globals=sts.globalElements();
if(globals!=null&&globals.length==1)
{
SchemaGlobalElement sge=全局[0];
SchemaType st=sge.getType();
SchemaProperty[]properties=st.getProperties();
for(int k=0;k
要阅读xsd中的注释,我必须做什么?我有同样的要求,并且能够解析xsd中的注释,如下所示 假设XSD如下所示:-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="ExterneDaten" type="ExterneDaten">
<xs:annotation>
<xs:documentation>annotation for ExterneDaten</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="ExterneDaten">
<xs:annotation>
<xs:documentation>annotation for Type ExterneDaten</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="value1" type="xs:string">
<xs:annotation>
<xs:documentation>annotation for value1</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="isTest" type="xs:boolean">
<xs:annotation>
<xs:documentation>annotation for boolean attribute isTest</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
public class XSDAnnotaionParser extends AnnotationParser {
private StringBuilder documentation = new StringBuilder();
@Override
public ContentHandler getContentHandler(AnnotationContext context, String parentElementName, ErrorHandler handler,
EntityResolver resolver) {
return new ContentHandler() {
private boolean parsingDocumentation = false;
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (parsingDocumentation) {
documentation.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
//say you want to parse the text in "documentaion" tag in your xsd....this is where we scpecify the tag
if (localName.equals("documentation")) {
parsingDocumentation = false;
}
}
@Override
public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
if (localName.equals("documentation")) {
parsingDocumentation = true;
}
}
@Override
public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void processingInstruction(String target, String data) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub
}
};
}
@Override
public Object getResult(Object existing) {
return documentation.toString().trim();
}
}
class AnnotationFactory implements AnnotationParserFactory {
@Override
public AnnotationParser create() {
return new XSDAnnotaionParser();
}
}
XSOMParser parser = new XSOMParser();
parser.setAnnotationParser(new AnnotationFactory());
try {
parser.parse(xml);
} catch (SAXException ex) {
throw new SchemaException(ex);
}
现在,我们为上面创建的自定义注释解析器创建一个工厂类,如下所示:-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="ExterneDaten" type="ExterneDaten">
<xs:annotation>
<xs:documentation>annotation for ExterneDaten</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="ExterneDaten">
<xs:annotation>
<xs:documentation>annotation for Type ExterneDaten</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="value1" type="xs:string">
<xs:annotation>
<xs:documentation>annotation for value1</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="isTest" type="xs:boolean">
<xs:annotation>
<xs:documentation>annotation for boolean attribute isTest</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
public class XSDAnnotaionParser extends AnnotationParser {
private StringBuilder documentation = new StringBuilder();
@Override
public ContentHandler getContentHandler(AnnotationContext context, String parentElementName, ErrorHandler handler,
EntityResolver resolver) {
return new ContentHandler() {
private boolean parsingDocumentation = false;
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (parsingDocumentation) {
documentation.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
//say you want to parse the text in "documentaion" tag in your xsd....this is where we scpecify the tag
if (localName.equals("documentation")) {
parsingDocumentation = false;
}
}
@Override
public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
if (localName.equals("documentation")) {
parsingDocumentation = true;
}
}
@Override
public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void processingInstruction(String target, String data) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub
}
};
}
@Override
public Object getResult(Object existing) {
return documentation.toString().trim();
}
}
class AnnotationFactory implements AnnotationParserFactory {
@Override
public AnnotationParser create() {
return new XSDAnnotaionParser();
}
}
XSOMParser parser = new XSOMParser();
parser.setAnnotationParser(new AnnotationFactory());
try {
parser.parse(xml);
} catch (SAXException ex) {
throw new SchemaException(ex);
}
现在,我们将自定义注释解析器添加到XSOMParser,用于解析XSD,如下所示:-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="ExterneDaten" type="ExterneDaten">
<xs:annotation>
<xs:documentation>annotation for ExterneDaten</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="ExterneDaten">
<xs:annotation>
<xs:documentation>annotation for Type ExterneDaten</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="value1" type="xs:string">
<xs:annotation>
<xs:documentation>annotation for value1</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute name="isTest" type="xs:boolean">
<xs:annotation>
<xs:documentation>annotation for boolean attribute isTest</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
public class XSDAnnotaionParser extends AnnotationParser {
private StringBuilder documentation = new StringBuilder();
@Override
public ContentHandler getContentHandler(AnnotationContext context, String parentElementName, ErrorHandler handler,
EntityResolver resolver) {
return new ContentHandler() {
private boolean parsingDocumentation = false;
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (parsingDocumentation) {
documentation.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
//say you want to parse the text in "documentaion" tag in your xsd....this is where we scpecify the tag
if (localName.equals("documentation")) {
parsingDocumentation = false;
}
}
@Override
public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
if (localName.equals("documentation")) {
parsingDocumentation = true;
}
}
@Override
public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void processingInstruction(String target, String data) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub
}
};
}
@Override
public Object getResult(Object existing) {
return documentation.toString().trim();
}
}
class AnnotationFactory implements AnnotationParserFactory {
@Override
public AnnotationParser create() {
return new XSDAnnotaionParser();
}
}
XSOMParser parser = new XSOMParser();
parser.setAnnotationParser(new AnnotationFactory());
try {
parser.parse(xml);
} catch (SAXException ex) {
throw new SchemaException(ex);
}
对于解析文档标记,我们可以使用以下代码:-
XSSchemaSet schemaSet = null;
try {
schemaSet = parser.getResult();
} catch (SAXException ex) {
throw new SchemaException(ex);
}
Iterator<XSElementDecl> iterator = schemaSet.iterateElementDecls();
while (iterator.hasNext()) {
XSElementDecl elementDecl= (XSElementDecl) iterator.next();
XSComplexType eleCompDecl= elementDecl.getType().asComplexType();
if (eleCompDecl!= null) {
//we get the annotation here
XSAnnotation annotaion = eleCompDecl.getAnnotation();
//this will print the tezxt inside documentaion tag
System.out.println(annotaion.getAnnotation());
}
}
XSSchemaSet schemaSet=null;
试一试{
schemaSet=parser.getResult();
}捕获(SAXEx异常){
抛出新SchemaException(ex);
}
迭代器迭代器=schemaSet.iterateElementDecls();
while(iterator.hasNext()){
XSElementDecl elementDecl=(XSElementDecl)迭代器.next();
XSComplexType eleCompDecl=elementDecl.getType().asComplexType();
如果(eleCompDecl!=null){
//我们在这里得到注释
XSAnnotation annotation=eleCompDecl.getAnnotation();
//这将打印tezxt内部文档标签
System.out.println(annotation.getAnnotation());
}
}
读取xsd属性内部注释的代码如下:-
Collection<? extends XSAttributeUse> attributes= eleCompDecl.getAttributeUses();
Iterator<? extends XSAttributeUse> iterator = attributes.iterator();
while(attributes.hasNext()) {
XSAttributeUse next = attributes.next();
XSAttributeDecl attributeDecl = next.getDecl();
String desc = null;
if(attributeDecl != null) {
try {
desc = (String)attributeDecl.getAnnotation().getAnnotation();
System.out.println("the documentaion for the attribute is "+desc)
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Collection我遇到了同样的问题,并用ApacheXMLBeans以下面描述的方式为我解决了这个问题。该示例基本上是Groovy代码,但应该很容易移植到Java
void parseDocumentations(File xsdFile) {
// load the xsd
XmlObject object = XmlObject.Factory.parse(xsdFile)
List<XmlObject> objectList = []
objectList.add(object)
// parse the xsd content to a object tree
SchemaTypeSystem sts = XmlBeans.compileXsd((XmlObject[])objectList.toArray(), XmlBeans.getBuiltinTypeSystem(), null)
def globalTypes = sts.globalTypes()
// iterate over the defined types in the xsd
for (SchemaType type: globalTypes) {
def annotation = type.getAnnotation()
if (annotation!=null) {
// get the sub xml nodes of the annotation node
def userInfos = annotation.userInformation
for (XmlObject userInfo: userInfos ) {
if (userInfo.getDomNode().localName=='documentation') {
// extract the text from documentation node
def documentationTxt = userInfo.getDomNode().getFirstChild().getNodeValue()
println documentationTxt
}
}
}
}
}
void解析文档(文件xsdFile){
//加载xsd
XmlObject=XmlObject.Factory.parse(xsdFile)
列表对象列表=[]
objectList.add(对象)
//将xsd内容解析为对象树
SchemaTypeSystem sts=XmlBeans.compileXsd((XmlObject[])objectList.toArray(),XmlBeans.getBuiltinTypeSystem(),null)
def globalTypes=sts.globalTypes()
//迭代xsd中定义的类型
for(SchemaType类型:全局类型){
def annotation=type.getAnnotation()
if(注释!=null){
//获取注释节点的子xml节点
def userInfos=annotation.userInformation
for(XmlObject userInfo:userInfos){
if(userInfo.getDomNode().localName=='documentation'){
//从文档节点提取文本
def documentationTxt=userInfo.getDomNode().getFirstChild().getNodeValue()
println文档
}
}
}
}
}
这里已经显示了一个解决方案:但是上面的解决方案不读取直接声明为元素子元素的注释,而只读取声明为类型定义子元素的注释。因此,在上面的示例中,不会读取“ExterneDaten的注释”,但会读取以下内容:ExterneDatenh类型的注释如何将代码连接到XmlBeans?怎么样