为伪html编写XML模式

为伪html编写XML模式,xml,xsd,Xml,Xsd,我试图为一些类似HTML的XML编写一个模式。 它有标签,所有标签都在(aragraph)标签内。问题是它们可以是任意顺序: <p> <u><b>test</u><b> </p> <xs:element name="HTMLDocument"> <xs:complexType> <xs:sequence> <xs:element name="p" type=

我试图为一些类似HTML的XML编写一个模式。 它有标签,所有标签都在(aragraph)标签内。问题是它们可以是任意顺序:

<p> <u><b>test</u><b> </p>
<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>
测试

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>
测试

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>
我试图创建一个自引用的复杂类型,但总是出现“无效模式”错误。如果有人能指导我正确的方法,我将不胜感激

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>
模式:

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>

gaah,诅咒你的XML模式

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>
对不起,只是有时候需要把它说出来。我认为这正是您想要的,但一些测试也不会太坏:

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:element name="HTMLDocument">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="textElements" mixed="true">
            <xs:group ref="textElementGroup" minOccurs="0" maxOccurs="unbounded"/>
    </xs:complexType>

    <xs:group name="textElementGroup">
        <xs:choice>
            <xs:element name="b" type="textElements" minOccurs="0" maxOccurs="1"/>
            <xs:element name="i" type="textElements" minOccurs="0" maxOccurs="1"/>
            <xs:element name="u" type="textElements" minOccurs="0" maxOccurs="1"/>
            <xs:element name="a" type="textElements" minOccurs="0" maxOccurs="1"/>
            <xs:element name="font" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="textElements">
                            <xs:attribute name="size" type="xs:string"/>
                            <xs:attribute name="face" type="xs:string"/>
                            <xs:attribute name="color" type="xs:string"/>
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="img" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:attribute name="src" type="xs:string"/>
                    <xs:attribute name="width" type="xs:decimal"/>
                    <xs:attribute name="height" type="xs:decimal"/>
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:group>

</xs:schema>


编辑:哦,看起来你不需要那个额外的xs:sequence。我将把它去掉…

一个很好的设计模式是使用抽象元素和替换组。将textElements的内容模型定义为
。将
inline
定义为抽象元素。将元素b、i、u等定义在内联的替换组中。将内联的内容模型定义为textElements

<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>

这种方法的优点是,您(或您的继任者)可以随时向替换组添加新元素,而不会对现有定义产生任何影响。

Brilliant,这非常有效。我对xml模式还不熟悉,而且“gaaah”也引起了我的共鸣…@shane我对xml模式并不陌生,但每次它都会让我近乎疯狂。我永远无法理解为什么有些东西会如此反直觉地工作。有时晚上,当我独自一人在办公室时,我会打印出它的规格,然后立即用碎纸机把它撕碎。不管怎样,我想你明白了。@B是的,哦是的。。。我非常喜欢。但Java的支持范围似乎从“实验性”到“5年内未更新”。我有点犹豫不决。但我非常喜欢使用任何其他模式语言……在Java 1.6中,它与W3C XML模式是平等的公民。@b argulies-Hmm,很有趣。但是XML验证API根据合同仅需要支持W3CXML模式,即使标准实现可以这样做,如果我没有弄错的话,RNG对JAXB的支持仍然是实验性的。这是我最大的用例。同样,JAXB使用模式不会像上面那样面临挑战。我主要是用它来为我的懒屁股生成代码。
<xs:element name="HTMLDocument">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="p" type="textElements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="textElements" mixed="true">
  <xs:group>
    <xs:element name="b" type="textElements"/>
    <xs:element name="i" type="textElements"/>
    <xs:element name="u" type="textElements"/>
    <xs:element name="a" type="textElements"/>
    <xs:element name="font" type="textElements">
      <xs:complexType>
        <xs:attribute name="size" type="xs:string"/>
        <xs:attribute name="face" type="xs:string"/>
        <xs:attribute name="color" type="xs:string"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="img">
      <xs:complexType>
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:decimal"/>
        <xs:attribute name="height" type="xs:decimal"/>
      </xs:complexType>
    </xs:element>
  </xs:group>
</xs:complexType>

</xs:schema>