【问题标题】:XSD for Alternating Elements用于交替元素的 XSD
【发布时间】:2015-06-14 18:47:27
【问题描述】:

我有如下所示的 XML:

<?xml version="1.0" encoding="utf-8"?>
<main>
  <bbcor Location="string" Name="string">
    <PipeDiameter_INCH>3.1415926535</PipeDiameter_INCH>
    <InitialPressure_PSI>3335.566</InitialPressure_PSI>
    <LWISE TotalSection="2">
      <DL_FT>535.00</DL_FT>            <HL_FT>653.00</HL_FT>
      <DL_FT>245.98</DL_FT>            <HL_FT>395.0</HL_FT>
    </LWISE>
  </bbcor>
</main>

我正在尝试为上述文件制作 XSD 验证器,但卡在交替元素中,即

<DL_FT>2.4</DL_FT> <HL_FT>234.00</HL_FT>
<DL_FT>3.5</DL_FT> <HL_FT>456.00</HL_FT>
<DL_FT>6.8</DL_FT> <HL_FT>678.00</HL_FT>

我尝试了在线生成器等,但没有一个提供所需的 XSD。当前的 XSD 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified"
            elementFormDefault="qualified" 
            version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="main">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="bbcor">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="PipeDiameter_INCH" type="xsd:decimal" />
              <xsd:element name="InitialPressure_PSI" type="xsd:decimal" />
              <xsd:element name="LWISE">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" name="DL_FT" type="xsd:decimal" />
                    <xsd:element maxOccurs="unbounded" name="HL_FT" type="xsd:decimal" />
                  </xsd:sequence>
                  <xsd:attribute name="TotalSection" type="xsd:int" />
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="Location" type="xsd:string" />
            <xsd:attribute name="Name" type="xsd:string" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

上面的 XSD 有什么问题?我正在使用 xmllint 来验证上面的 XML 文件。 XSD 不允许替代元素吗?当元素发生时它起作用了

<DL_FT>2.45</DL_FT> 
<DL_FT>2.44</DL_FT>
<DL_FT>2.35</DL_FT>
<HL_FT>245</HL_FT>
<HL_FT>445</HL_FT>
<HL_FT>545</HL_FT>

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    你很亲密。只需maxOccurs="unbounded" 分解为xsd:sequence

    具体来说,改变

                  <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" name="DL_FT" type="xsd:decimal" />
                    <xsd:element maxOccurs="unbounded" name="HL_FT" type="xsd:decimal" />
                  </xsd:sequence>
    

                  <xsd:sequence maxOccurs="unbounded">
                    <xsd:element name="DL_FT" type="xsd:decimal" />
                    <xsd:element name="HL_FT" type="xsd:decimal" />
                  </xsd:sequence>
    

    因为是 DL_FT-HL_FT pairs 意味着无限期地重复。


    更新:

    半对

    我没有提到上述解决方案很简单只是,因为您的示例是基于对的。 (感谢 Michael Kay 的提醒。)如果您需要在正常配对之后允许非配对的散乱者,例如单独的 DL_FT 散乱者,

    <DL_FT>2.4</DL_FT> <HL_FT>234.00</HL_FT>
    <DL_FT>3.5</DL_FT> <-- no HL_FT here -->
    

    您将遇到一个经典的、完全模棱两可的内容模型问题,并且无法通过 XSD 检查这种模式。但是,RELAX NG 可以代表这种模式。

    【讨论】:

    • 然而,有一个教科书问题,它更难解决:这里允许的序列是 ABAB、ABABA、ABABAB 和 ABABABA。 (例如,一盘黑白棋交替走棋的记录)。
    • 感谢 Hughes 先生,目前在 XML 领域有很多工作要做。但由于软件巨头缺乏兴趣,XML 正在遭受痛苦……然而,XML 比任何东西都强大。
    猜你喜欢
    • 2023-03-29
    • 2017-02-13
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多