Xerxes / SAX2报告错误的元素

时间:2016-05-09 16:35:56

标签: xsd xml-parsing saxparser xerces

今年我为Festivus发表的申诉表中记载的一件事是Xerces / SAX2如何报告解析错误。

取一点XSD:

<xs:sequence>
    <xs:element ref="element1" />
    <xs:element ref="element2" />
    <xs:element ref="element3" />
    <xs:element ref="element4"     minOccurs="0" />
    <xs:element ref="element5" />
    <xs:element ref="element6"  minOccurs="1" />
    <xs:element ref="element7"       minOccurs="0" />
    <xs:element ref="element8" minOccurs="0" />
    <xs:choice minOccurs="0">
        <xs:element ref="choiceElement1" />
        <xs:element ref="choiceElement2" />
    </xs:choice>
    <xs:element ref="element9" minOccurs="0" />
</xs:sequence>

和示例XML

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<xmldocument xmlns="http://www.somewebsite.com/xsd/xmldocument" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.somewebsite.com/xsd/xmldocument xmldocument.xsd">

  <transaction msgId="MESSAGE-ID">
    <element1>KS0003</element1>
    <element2>2016-05-09</element2>
    <element3>10:20:50</element3>
    <element5>99433</element5>
    <element8>jesse</element8>
  </transaction>

</xmldocument>

我收到此错误:

  

RAW SAX2 ERROR:文件“/ tmp / QACXV0Z346”出错,行= 10,列= 17,   XML元素= element8,元素'element8'对内容无效   模型:   '((部件1,element2的,元素3,元素4,元素5,元素6,元素7,元素8,(choiceElement1 | choiceElement1)),元素9)'

在我看来,这里的问题不是element8,它是element6,它被设置为必需,但却是XML中实际缺失的那个。

我有一些代码尝试解析这个字符串并弄清楚真正的问题是什么,但错误字符串不包含任何有关可选元素的信息等。我可能没有正确设置 - 也许。我对SAXException有一个问题 - 它几乎没用 - 所以我需要的是来自某些东西的更多信息,告诉我真正的问题是什么。

我们正在使用Xerces 2.6或2.8,因为我们在IBM i上运行,除非您升级操作系统,否则它们不会提供此类内容的更新。

1 个答案:

答案 0 :(得分:0)

Xerces错误消息实际上非常好。

你可能会争辩说,在这种特殊情况下,最好是按照

的方式说些什么
  

遇到element8,但预计会element6

对于这个简单的案例来说这很好,但是要意识到在一般情况下,可能存在一个任意复杂的表达式,涵盖了可能已经预期的内容。准备好引入大量的复杂性来简明地解释在解析出错的特定点上所允许的内容。引用第一个矛盾点以及违反的父母内容模型要求一般都不是一个坏的诊断。