我在我的android项目中使用此http://ws.apache.org/commons/XmlSchema/。我正在遍历XML模式,该模式具有以下版本,
<xs:schema version="4.0.2" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:p="http://test.com/schema" attributeFormDefault="unqualified" elementFormDefault="qualified" >
XmlSchemaCollection schemaCol = new XmlSchemaCollection();
XmlSchema xmlSchema = schemaCol.read(new StreamSource(is), null);
String version = xmlSchema.getVersion();
但是当看version
时,它总是为空。
我也在尝试提取嵌入在'sequence'标签中的自定义属性。
<xs:sequence maxOccurs="unbounded" p:customattrib="true">
有人可以告诉我如何从XML文档中提取“版本”和自定义属性。
答案 0 :(得分:0)
我不得不编辑源代码,没有别的办法。
答案 1 :(得分:0)
通过查看此库解析XML模式的方式,看起来不会保留此信息。例如,sequence
元素被解析为:
XmlSchemaSequence sequence = new XmlSchemaSequence();
// handle min and max occurences
sequence.setMinOccurs(getMinOccurs(sequenceEl));
sequence.setMaxOccurs(getMaxOccurs(sequenceEl));
for (Element el = XDOMUtil.getFirstChildElementNS(sequenceEl, XmlSchema.SCHEMA_NS);
el != null;
el = XDOMUtil.getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) {
...
只读取minOccurs
和maxOccurs
属性(如果存在),然后移动到子节点。虽然您可以查看sequenceEl
并确实存在customattrib
,但其值不会复制到XmlSchemaSequence
对象中。
如果修改库是一个选项,那么您可以通过硬连线SchemaBuilder.handleSequence()
来阅读它,例如:
String customAttrib = sequenceEl.getAttribute("customattrib");
或者,更好的是,将新成员添加到XmlSchemaObject
,比如说
public Map<String, String> extraAttributes = new HashMap<String, String>();
然后读取所有自定义属性,如下所示:
NamedNodeMap attributes = sequenceEl.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
Node attNode = attributes.item(i);
sequence.extraAttributes.put(attNode.getLocalName(), attNode.getNodeValue());
}
同样在handleXmlSchemaElement()
中获取version
属性。虽然此更改或多或少是合理的,但应从所有 handle<X>
中的SchemaBuilder
方法调用此代码。
另一个选择,如果修改架构本身是可行的,那就是使用XSD注释而不是自定义属性。这个框架似乎正确地读取了注释。