0

我有一个<assert>验证多个字段的 XSD 规则,例如:

<xs:assert test="if(FIELD1/@value = (2,3,4) and not(exists(FIELD2/@value))) then false() else true()" xerces:message="Field 1 is 2, 3 or 4 but field 2 still has no value. Check that, please">
    <xs:annotation>
        <xs:appinfo>
            <das:rule_fields>
                <das:field value="FIELD1"/>
                <das:field value="FIELD2"/>
            </das:rule_fields>
        </xs:appinfo>
    </xs:annotation>
</xs:assert>

我经过验证的 XML 如下所示:

<body>
    <residents>
        <resident>
            <data>
                <ID value="123">
                <FIELD1 value="3"/>
                <FIELD2/>
            </data>         
        </resident>
        <resident>
            <data>
                <ID value="456">
                <FIELD1 value="0"/>
                <FIELD2/>
            </data>         
        </resident>
        <resident>
            <data>
                <ID value="789">
                <FIELD1 value="3"/>
                <FIELD2 value="1"/>
            </data>         
        </resident>
    </residents>
</body>

我的验证代码看起来像这样(变得更短更容易):

try {
    SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
    XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(XML);
    Schema schema = factory.newSchema(new Source[] { 
                    new StreamSource(new File(MY_XSD))
    });
    Validator validator = schema.newValidator();            
            
    validator.setErrorHandler(new ErrorHandler(){               
        @Override
        public void warning(SAXParseException exception) throws SAXException {
            exceptionBase.add(exception);
        }
        @Override
        public void fatalError(SAXParseException exception) throws SAXException {
            exceptionBase.add(exception);
        }
        @Override
        public void error(SAXParseException exception) throws SAXException {
            exceptionBase.add(exception);
        }
    });
    validator.validate(new StAXSource(reader));             
} catch (IOException | SAXException | XMLStreamException | FactoryConfigurationError e) {
    e.printStackTrace();
} 

当我验证 XML 时,resident/data带有ID123 的块违反了断言,因为 FIELD1 为 3(在 2、3、4 中)并且 FIELD2 没有值。我的 SAXParseException 与我的断言消息一起抛出(“字段 1 是 2、3 或 4,但字段 2 仍然没有值。请检查一下”)。XMLStreamReader reader站在我的结束</data>标记的位置,即 END_ELEMENT 。对于 END_ELEMENT,我不能调用reader.getElementText(),所以有机会回到起始元素并打印<ID>(123) 的内容吗?

或者有没有其他方法可以获得<data>---</data>导致错误的整个块?

亲切的问候蒂莫

4

0 回答 0