我有一个简单的xsd
<xs:element name="shoesize" type="shoetype"/>
<xs:complexType name="shoetype">
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="country" type="attrType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="attrType">
<xs:restriction base="xs:string">
<xs:enumeration value="abc" />
<xs:enumeration value="xyz" />
</xs:restriction>
</xs:simpleType>我正在使用以下代码尝试检索complexType 'shoetype‘的基类型
void parseComplexType(XSComplexType xsComplexType, StringBuffer stringBuffer) {
XSContentType xsContentType = xsComplexType.getContentType();
if (xsContentType != null) {
XSParticle xsParticle = xsContentType.asParticle();
if (xsParticle != null) {
parseParticle(xsParticle, stringBuffer);
} else if (xsContentType.asSimpleType() != null) {
stringBuffer.append(parseSimpleType(xsContentType.asSimpleType()));
}
}
return;
}
String parseSimpleType(XSSimpleType xsSimpleType) {
if (xsSimpleType.isPrimitive()) {
return(xsSimpleType.getName());
}
if (xsSimpleType.asRestriction() != null) {
XSRestrictionSimpleType xsRestrictionSimpleType = xsSimpleType.asRestriction();
Iterator<XSFacet> facetIterator = xsRestrictionSimpleType.iterateDeclaredFacets();
if (facetIterator != null) {
// Special Case
if (!facetIterator.hasNext()) {
return xsSimpleType.getBaseType().getName();
}
StringBuffer strBuffer = new StringBuffer();
strBuffer.append("[");
while (facetIterator.hasNext()) {
XSFacet xsFacet = facetIterator.next();
if (xsFacet.getName().equals(XSFacet.FACET_ENUMERATION)) {
strBuffer.append(xsFacet.getValue() + (facetIterator.hasNext() ? " / " : ""));
} else if (xsFacet.getName()
.equals(XSFacet.FACET_MAXLENGTH)) {
strBuffer.append(xsSimpleType.getBaseType().getName());
break;
} else if (xsFacet.getName().equals(
XSFacet.FACET_FRACTIONDIGITS)) {
strBuffer.append(xsSimpleType.getBaseType().getName());
break;
} else if (xsFacet.getName().equals(
XSFacet.FACET_MINEXCLUSIVE)) {
strBuffer.append(xsSimpleType.getBaseType().getName());
break;
} else if (xsFacet.getName().equals(
XSFacet.FACET_MAXEXCLUSIVE)) {
strBuffer.append(xsSimpleType.getBaseType().getName());
break;
} else if (xsFacet.getName().equals(
XSFacet.FACET_MININCLUSIVE)) {
strBuffer.append(xsSimpleType.getBaseType().getName());
break;
} else if (xsFacet.getName().equals(
XSFacet.FACET_MAXINCLUSIVE)) {
strBuffer.append(xsSimpleType.getBaseType().getName());
break;
} else if (xsFacet.getName().equals(
XSFacet.FACET_LENGTH)) {
strBuffer.append(xsSimpleType.getBaseType().getName());
break;
} else if (xsFacet.getName().equals(
XSFacet.FACET_WHITESPACE)) {
// ignore
break;
} else {
// Log this type
System.out.println(xsFacet.getName());
}
}
strBuffer.append("]");
return strBuffer.toString();
}
} if (xsSimpleType.asComplexType() != null) {
StringBuffer stBuffer = new StringBuffer();
parseComplexType(xsSimpleType.asComplexType(), stBuffer);
return stBuffer.toString();
}
return null;
}但是我得到了'decimal‘作为整数名,但它实际上是一个xs: baseType。它进入了parseSimpleType()方法中定义的'XSFacet.FACET_MAXLENGTH‘else部分。如何获取integer作为complexType的baseType?
发布于 2012-05-24 19:51:11
发布的代码遍历了从xs:integer到xs:decimal的基本类型链接;只有后者是原始的。这似乎是一种错误的期望:在XML Schema术语中,并不是所有的内置类型实际上都是原语。
有关详细信息,请参阅便捷的diagram in the XML Schema standard。
https://stackoverflow.com/questions/8666956
复制相似问题