java - 如何使用 xml 模式验证 xml?

标签 java xml xsd xml-validation

是否可以使用以下模式验证以下 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>

关于java - 如何使用 xml 模式验证 xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3260053/

相关文章:

java - Hibernate 不更新(合并)对象

java - 无法发送显示 SocketException : Connection reset 的 post https 请求

javascript - 为什么 IE 以外的浏览器中 DOM Document 对象中缺少 XML 属性

java - 将 java 对象逆向工程为 xsd

wcf - 为什么公共(public)属性(property)没有被序列化?

java - JAXP:如何在XML解析期间动态解析Schema?

java - 如何计算日期差异?

java - 发送到 JMS 队列的消息将仅由单个消费者消费?

java - 在没有互联网的情况下,需要更多时间从类路径加载 spring-*.xsd 文件

java - 如何在运行时修改 Camel 端点