3

是否可以使用以下架构验证以下 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();
        }
4

3 回答 3

2

可能是一个烦人的命名空间问题。该元素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>
于 2010-07-15T21:20:14.663 回答
2

您可以改为修改 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>
于 2010-07-16T12:10:05.467 回答
0

http://www.edankert.com/apis/jaxp.document-builder-factory.schema-validation.html

factory.setValidating(true)

编辑——没关系,我在第一次阅读时没有看到“不指定架构”;)

于 2010-07-15T21:14:13.507 回答