gpt4 book ai didi

xsd - 创建使用 元素打开的有效 XSD

转载 作者:行者123 更新时间:2023-12-04 12:00:08 25 4
gpt4 key购买 nike

我需要指定一个 XSD 来验证 XML 文档。 XSD 将用于生成 JAXB 的 Java 绑定(bind)。
我的问题是指定我不知道其名称并且我通常对解析不感兴趣的可选元素。

XML 文档的结构如下:

<TRADE>
<TIME>12:12</TIME>
<MJELLO>12345</MJELLO>
<OPTIONAL>12:12</OPTIONAL>
<DATE>25-10-2011</DATE>
<HELLO>hello should be ignored</HELLO>
</TRADE>

重要的是,那:
  • 我不能假设任何顺序,下一个 XML 文档实例可能有不同顺序的标签
  • 我只对解析一些标签感兴趣,有些是强制性的,有些是可选的
  • XML 文档可以用我对解析不感兴趣的新元素进行扩展

  • 我的 XSD 的结构类似于( 不是有效的 xsd ):
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <!-- *********************************************** -->
    <!-- Trade element definitions for the XML Documents -->
    <!-- *********************************************** -->

    <xs:complexType name="Trade">
    <!-- Using the all construction ensures that the order does not matter -->
    <xs:all>
    <xs:element name="DATE" type="xs:string" minOccurs="1" maxOccurs="1" />
    <xs:element name="TIME" type="xs:string" minOccurs="1" maxOccurs="1" />
    <xs:element name="OPTIONAL" type="xs:string" minOccurs="0" maxOccurs="1" />
    <xs:any minOccurs="0"/>
    </xs:all>
    </xs:complexType>

    <!-- TRADE is the mandatory top-level tag -->
    <xs:element name="TRADE" type="Trade"/>

    </xs:schema>

    因此,在此示例中:DATE 和 TIME 是强制性的(它们必须在 XML 中恰好出现一次),OPTIONAL 可能出现一次,然后我想指定允许所有其他标签。顺序无关紧要。

    如何为此指定有效的 XSD?

    最佳答案

    这是一个经典的解析器问题。

    基本上,您的 BNF 是:

    Trade    = whatever whatever*
    whatever = "DATE" | "TIME" | anything
    anything = a-z a-z*

    但这是模棱两可的。字符串“DATE”在任何规则下都可以被接受为“DATE”和任何东西。

    所以如果你有
    <TRADE>
    <TIME>12:12</TIME>
    <DATE>25-10-2011</DATE>
    <DATE>25-12-2011</DATE>
    </TRADE>

    是否应接受这一点尚不清楚。

    它可以解释为
    "TIME", "DATE", anything
    anything, anything, "DATE"
    anything, anything, anything
    "TIME", "DATE", anything
    "TIME", "DATE", "DATE"
    etc.

    这一切都归结为:如果您有一个与随机序列相结合的通配符,您将无法有意义地决定哪个 token 与哪个规则匹配。

    将可选元素与通配符一起使用尤其没有意义。

    你有两个选择:
  • 使用 xs:sequence 代替 xs:all
  • 不要使用通配符

  • 据我了解,这两种选择都与您的意愿相冲突。

    也许您可以构造一个通配符来匹配除 DATE、TIME 等之外的所有内容。

    关于xsd - 创建使用 <all> 和 <any> 元素打开的有效 XSD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178255/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com