【问题标题】:Xml default attribute values ignored by parsers解析器忽略的 XML 默认属性值
【发布时间】:2014-08-19 11:23:59
【问题描述】:

我正在尝试使用 SAXStaxDOM 解析器解析 XMl 文件(根据我的任务)。我遇到的问题是所有解析器似乎都忽略了 XSD 架构中指定的属性的默认值。

 <complexType name="Tariff" abstract="true">
    <sequence>
        <element name="id" type="ID" />            
        <element name="monthly-fee" type="float" />
    </sequence>
    <attribute name="status" type="trns:Status" use="optional" default="active"/>
</complexType>

<complexType name="LocalTariff">
    <complexContent>
        <extension base="trns:Tariff">
            <sequence>
                <element name="internal-charge" type="trns:CallCharge" />
                <element name="external-charge" type="trns:CallCharge" />
            </sequence>
        </extension>
    </complexContent>
</complexType>

这里是属性类型定义:

<simpleType name="Status">
    <restriction base="string">
        <enumeration value="active"></enumeration>
        <enumeration value="supported"></enumeration>
        <enumeration value="unavailable"></enumeration>
    </restriction>
</simpleType>

我希望解析器自动插入带有默认值的缺失属性。

<local-tariff>
    <id>id1</id>       
    <monthly-fee>20.5</monthly-fee>
    <internal-charge>3.7</internal-charge>
    <external-charge>2.5</external-charge>
</local-tariff>

我的猜测是我没有指定一些参数来让解析器考虑我的 XSD

有人可以请教我这个问题吗?我是 XML 新手。任何帮助将不胜感激。

【问题讨论】:

    标签: java xml parsing xsd attr


    【解决方案1】:

    您要查找的内容来自Post-Schema Validation Infoset,而不是来自 SAX 解析器。解析器只告诉您文档中的内容。您想要架构隐含的内容,这意味着您必须有一个步骤来实际验证架构,否则系统如何知道架构隐含的内容?

    Here is a link 关于如何使用 PSVI 作为 Apache Xerces 提供的 SAX 解析器的一部分。代码可能如下所示:

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    XMLReader reader = parser.getXMLReader();
    PSVIProvider psviProvider = (PSVIProvider)reader;
    

    然后查看javadocs。您可以获取有关任何属性的信息,包括其在架构下的默认值。

    【讨论】:

    • 谢谢,您的回答帮助我开始思考正确的方向。至于 SAX,我想出了以下解决方案:private XMLReader reader; ... reader = XMLReaderFactory.createXMLReader(); reader.setFeature("http://apache.org/xml/features/validation/schema", Boolean.TRUE);
    【解决方案2】:

    您将需要使用模式感知解析器。 XML 和 XSD 是两个不同的规范;任何模式感知处理器都必须符合 XML 规范,但是有很多 XML 解析器不符合 XSD 规范。

    【讨论】:

      猜你喜欢
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2018-10-31
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      相关资源
      最近更新 更多