如何使用xml模式验证xml?
是否可以使用以下模式验证以下xml? 我想验证xml而不指定xml文件中的模式。如何使用xml模式验证xml?
我不确定这是否可行,但希望得到一些帮助,找出如何做到这一点。
当我尝试验证xml时,我总是收到以下错误。
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'contacts'.
<?xml version="1.0" ?>
<contacts>
<contact>
<names>Joe Buddah</names>
<address>123 Black Jack Cove</address>
<phone>555-555-1212</phone>
</contact>
<contact>
<name>Ray Buddah</name>
<address>123 Black Jack Cove</address>
<phone>555-555-1212</phone>
</contact>
</contacts>
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://madeupdomain.com/xml/contacts" xmlns:tns="http://madeupdomain.com/contacts" elementFormDefault="qualified">
<complexType name="contactType">
<sequence>
<element name="name" type="string" maxOccurs="1" minOccurs="1"></element>
<element name="address" type="string"></element>
<element name="phone" type="string"></element>
</sequence>
</complexType>
<complexType name="contactsType">
<sequence>
<element name="contact" type="tns:contactType" minOccurs="0" maxOccurs="unbounded"></element>
</sequence>
</complexType>
<element name="contacts" type="tns:contactsType"></element>
</schema>
我正在用来验证的Java代码。
static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException
{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilderFactory.setAttribute(JAXP_SCHEMA_SOURCE, new File("src/main/resources/contacts.xsd"));
// parse an XML document into a DOM tree
DocumentBuilder parser = documentBuilderFactory.newDocumentBuilder();
Document document = parser.parse(new File("src/main/resources/contacts.xml"));
// create a SchemaFactory capable of understanding WXS schemas
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// load a WXS schema, represented by a Schema instance
Source schemaFile = new StreamSource(new File("src/main/resources/patient.xsd"));
Schema schema = factory.newSchema(schemaFile);
// create a Validator instance, which can be used to validate an instance document
Validator validator = schema.newValidator();
// validate the DOM tree
try
{
validator.validate(new DOMSource(document));
}
catch (SAXException e)
{
e.printStackTrace();
}
您可以修改XML架构来代替。从模式中删除targetNamespace。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="contactType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string" maxOccurs="1" minOccurs="1"/>
<xsd:element name="address" type="xsd:string"/>
<xsd:element name="phone" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="contactsType">
<xsd:sequence>
<xsd:element name="contact" type="contactType" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="contacts" type="contactsType"/>
</xsd:schema>
http://www.edankert.com/apis/jaxp.document-builder-factory.schema-validation.html
factory.setValidating(true)
编辑 - 没关系,我没有看到 “不指定模式” 在我第一次读;)
可能是一个恼人的命名空间的问题。元素contact
在名称空间http://madeupdomain.com/xml/contacts
中定义,但xml文档中的实际contacts
元素位于默认名称空间中。
这可能已经删除错误:
<contacts xmlns="http://madeupdomain.com/xml/contacts">
<contact>
<names>Joe Buddah</names>
<address>123 Black Jack Cove</address>
<phone>555-555-1212</phone>
</contact>
<contact>
<name>Ray Buddah</name>
<address>123 Black Jack Cove</address>
<phone>555-555-1212</phone>
</contact>
</contacts>
我的问题是我可以验证我使用xml架构发布的xml,而无需更改xml文件。当我对xml文件进行更改时,它会进行验证。 – ScArcher2 2010-07-15 21:50:44
您已经拥有了dom - 只需访问所有元素并将元素的名称空间设置为“http:// madeupdomain.com/xml/contacts”。这也应该起作用。验证文档之前,元素节点“contacts”必须位于正确的名称空间中。 – 2010-07-15 22:00:34
修复它。谢谢!! – ScArcher2 2010-07-16 13:15:22