xml架构版本始终为null且序列属性未读取

时间:2014-07-10 07:07:45

标签: java android xml

我在我的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文档中提取“版本”和自定义属性。

2 个答案:

答案 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)) {
         ...

只读取minOccursmaxOccurs属性(如果存在),然后移动到子节点。虽然您可以查看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注释而不是自定义属性。这个框架似乎正确地读取了注释。