当前位置: 首页 > 知识库问答 >
问题:

当元素具有空值时,如何接受xsd与xml验证

淳于恺
2023-03-14

我有一个xml,必须根据xsd验证结构和数据类型。但xml中的某些字段具有空/空值。但是当使用JAXB验证xml时

“cvc数据类型有效。1.2.1:“”不是“整数”的有效值。”

此异常是从带有链接SaxParserError异常的JAXB异常引发的。但我必须接受带有空值的xml。这些线程验证了一个带有空属性和元素类型(long)且没有内容的XML模式,这表明我们必须修改关于xsd的XML,以便它能够接受null/empty值。

有没有其他方法可以重写ValidationHandler类和Unmarshaller类的方法以接受空值。


共有1个答案

钦永贞
2023-03-14

我猜你是想把

<myinteger></myinteger>

在XML中,但有一个XSD,如:

<element name="myinteger" type="integer" />

<element minOccurs="0" name="myinteger" type="integer" />

JAXB是对的。就XSD验证而言,这是错误的,所以您要么必须更改XML,要么更改XSD,要么禁用验证(仍然是错误的,但不会崩溃)。MinOccurs="0"意味着接受元素根本不存在(删除所有myinteger标记)。这并不意味着接受内容为空的标记。内容必须是整数。空字符串不是整数。

设置nillable=true也不起作用。这意味着这将被接受:

<myinteger xsi:nil="true"></myinteger>

但您必须添加这个xsi:nil=“true”。

如果您确实想接受这一点:

<myinteger></myinteger>

您可以按以下方式更改XSD:

<element name="myinteger" type="IntegerOrNothing" />

<xsd:simpleType name="IntegerOrNoting">
    <xsd:union memberTypes="xsd:integer">
        <xsd:simpleType>
            <xsd:restriction base="xsd:string">
                <xsd:enumeration value="" />
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:union>
</xsd:simpleType>

如果使用Jaxb从XSD生成bean,默认情况下,这种类型的字段将是String。然后需要使用自定义绑定来获取整数字段。

 类似资料:
  • 我无法使用下面的XSD验证XML, XSD数据 我在用XML验证这个XSD时遇到以下错误, cvc复合型。2.4.答:发现以元素“standardHeader”开头的内容无效。应为“{standardHeader}”之一。 如何提供此标签:

  • 我试图根据内部引用另一个XSD的XSD验证XML(使用include语句)。 作为, 现在,当根据xsd(Schema1.xsd)验证我的XML时,如下所示: 我得到一个错误,“cvc-datatype-valid.1.2.1:'true'不是'boolean'的有效值。” 这是针对schema1.xsd引用的schema2.xsd中定义的元素。 如果我做错了什么,请告诉我。

  • 我必须用以下xml为系统编写XSD 属性元素可以有多个枚举,每个不同的枚举可以有不同的数据类型 是否可以设置XSD限制/方面,以便 Name="Date"属性强制执行日期/时间格式 Name="Name"的属性强制执行字符串 非常感谢。

  • 我正在尝试为小型XML创建XSD,它的默认名称空间为

  • 问题内容: 我从Google的AdWords网站获取数据,该网站包含多个具有相同元素的元素。 您能否解释为什么以下3个查询没有得到相同答案(2)? 现场演示 HTML: JS: 问题答案: 根据W3C规范,具有2个具有相同ID的元素不是有效的html。 当您的CSS选择器只有一个ID选择器(并且未在特定上下文中使用)时,jQuery使用本机方法,该方法仅返回具有该ID的第一个元素。 但是,在其他两

  • 我正在尝试编写用于XML检查的XML模式(XSD)。有一个元素包含枚举值和子元素。它的格式确实很奇怪,但被xml接受了。 XML元素能否同时包含文本和子元素? 我的案例: 我正在尝试编写xml模式(XSD)来验证格式。所需元素node1的文本有三个限制值。当文本的值等于“c”时,它还将包含一个子节点1。 例如,模式将通过以下情况: 或 或 但无论如何,它不会通过: 或 因为子节点1对于值“c”是必