需要XSD基本帮助 - 模式中的命名空间?

时间:2011-03-04 21:31:13

标签: java xml validation xsd xml-validation

我有类似下面的XML文件。

<credits>
    <property name="tag">
        <item>v0003</item>
    </property>
    <property
        name="tag">
        <item>mhma03h</item>
    </property>
</credits>

第一个要求是这个XML无论如何都无法改变。请不要在下面建议这样做。

我需要编写一个验证这个的模式。以及进行验证的Java代码。

我完全陷入困境,我不知道到底发生了什么。

这样的架构是什么样的?我已经得到了一个,但它太糟糕了,我不打算发帖。 :P我不想将命名空间附加到XML元素。它们是一成不变的。^ _ ^

我如何才能完成所有这些元素才能被解析器“找到”?我可以告诉它忽略所有这些名称空间废话。通过这种针对模式进行验证的应用程序,名称空间冲突根本不可能。

我试过把

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="books" elementFormDefault="unqualified">

我的命名空间信息和

更新:我已经更新了我正在做的事情,以反映到目前为止给出的答案! :)

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="property">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="item"/>
        </xs:sequence>
        <xs:attribute name="name" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="tag"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="item">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="mhma03h"/>
            <xs:enumeration value="v0003"/>
        </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="credits">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="property" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XML              V0003     

加载并验证是的代码。在您提出要求之前,可以加载 文件。我已经检查了20次。 :P

SAXParserFactory factory = SAXParserFactory.newInstance();

        SchemaFactory schemaFactory = 
            SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

        factory.setSchema(schemaFactory.newSchema(
            new Source[] {new StreamSource("small.xsd")}));


        javax.xml.parsers.SAXParser parser = factory.newSAXParser();

        org.xml.sax.XMLReader reader = parser.getXMLReader();
        reader.setFeature("http://xml.org/sax/features/validation", true);
        reader.setFeature("http://apache.org/xml/features/validation/schema", true);
 reader.parse(new InputSource("small.xml"));

2 个答案:

答案 0 :(得分:2)

这是与您发布的XML文件相对应的架构:

<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XMLSpy v2011 sp1 (http://www.altova.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="property">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="item"/>
        </xs:sequence>
        <xs:attribute name="name" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="tag"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="item">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="mhma03h"/>
            <xs:enumeration value="v0003"/>
        </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="credits">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="property" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

这可能无法正确捕获每个元素和属性的要求(检查是否发生了最小/最大,必需/可选属性等等......)但是它应该让您开始使用XML模式将验证正确。模式没有定义目标名称空间,因此您不必担心修改现有XML以在现有元素的名称空间前缀中添加。

答案 1 :(得分:-1)

在处理没有显式命名空间的文档时,您需要找到一种方法来告诉XML处理器将命名空间用作默认值。大多数处理器都有办法做到这一点,IIRC有一个名为setNoNamespaceSchema的方法或类似的方法。您将编写一个带有命名空间的XML模式,并告诉处理器(验证器,无论如何)将您的命名空间用于没有显式命名空间的文档。