我有类似下面的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"));
答案 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模式,并告诉处理器(验证器,无论如何)将您的命名空间用于没有显式命名空间的文档。