Проблема в проверке XML. MIn происходит не работает должным образом - PullRequest
3 голосов
/ 09 августа 2011

У меня есть пример кода, в котором я пытаюсь проверить XML с помощью метода проверки XML. И это работает правильно, за исключением minOccurs. Я дал код ниже. Пожалуйста, помогите мне найти мою ошибку.

Файл XSD (Live.xsd): -

            <?xml version="1.0" encoding="UTF-8"?>

             <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

                    <xsd:element name="Test" />

                    <xsd:complexType name="Test">
                        <xsd:sequence>
                        <xsd:element ref="player" />
                    </xsd:sequence> 
                    </xsd:complexType>


                    <xsd:element name="player" >

                    <xsd:complexType>
                        <xsd:sequence minOccurs="2">
                          <xsd:element name="name" type="xsd:string"/>
                          <xsd:element name="address">
                                  <xsd:complexType>
                                    <xsd:sequence>
                                      <xsd:element name="houseno" type="xsd:int" />
                                      <xsd:element name="street" type="xsd:string" />
                                    </xsd:sequence>
                                  </xsd:complexType>
                                </xsd:element>
                        </xsd:sequence>
                        <xsd:attribute name="id" type="xsd:string" />
                      </xsd:complexType>    
                      </xsd:element>


            </xsd:schema>

XML-файл (example.xml): -

                <?xml version="1.0" encoding="UTF-8"?>

                <Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="Live.xsd" >

                    <player id="1">
                        <name>Owen</name>
                        <address>
                            <houseno>10</houseno>
                            <street>downing hill</street>       
                        </address>
                    </player>

                </Test> 

Java-метод: -

                                 private void validate(File xml) {
                        try {
                            url = new URL(xsd.toURI().toString());//xsd
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        }


                        source = new StreamSource(xml); //xml
                        try {
                            System.out.println(url);
                            schema = schemaFactory.newSchema(url);
                        } catch (SAXException e) {
                            e.printStackTrace();
                        }
                        validator = schema.newValidator();
                        System.out.println(xml);
                        try {
                            validator.validate(source);
                        } catch (SAXException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

Я тоже пытался задать minOccurs = 2 внутри , но это не сработало

1 Ответ

2 голосов
/ 09 августа 2011

Помните, что значение по умолчанию для maxOccurs равно 1. Вы допускаете минимум 2 и максимум 1 ...

Попробуйте <xsd:sequence minOccurs="2" maxOccurs="unbounded">

Редактировать: осторожно с 'неограниченным', хотя; вы бы хотели установить его на приемлемый максимум, не давая никому возможности обстрелять вашу систему с помощью миллиарда узлов.

Edit2: , при условии, что xsd (исправленный с maxOccurs) и xml выше, этот код выведет «Проверка не удалась !!!» :

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class XMLValidate {

static File xsd;
static File xml;
static URL url;
static StreamSource source;
static SchemaFactory schemaFactory;
static Schema schema;
static Validator validator;

/**
 * @param args
 */
public static void main(String[] args) {
    xml = new File("example.xml");
    xsd = new File("Live.xsd");

    try {
        url = new URL(xsd.toURI().toString());// xsd
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

    source = new StreamSource(xml); // xml
    try {
        //System.out.println(url);
        schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        schema = schemaFactory.newSchema(url);
    } catch (SAXException e) {
        e.printStackTrace();
    }
    validator = schema.newValidator();
    //System.out.println(xml);
    try {
        validator.validate(source);
        System.out.println("Validation succesful!");
    } catch (SAXParseException e) {
        System.out.println("Validation failed!!!");
        //e.printStackTrace(); -- uncomment for detailed info on validation failing
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Если вы измените код для проверки следующего example2.xml , он выдаст «Проверка успешна!» :

<?xml version="1.0" encoding="UTF-8"?>

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<player id="1">
    <name>Owen</name>
    <address>
        <houseno>10</houseno>
        <street>downing hill</street>
    </address>
    <name>Maggy</name>
    <address>
        <houseno>10</houseno>
        <street>downing hill</street>
    </address>
</player>

</Test>

Ваш xsd с minOccurs = 2 заставляет вас дважды иметь имя-адрес последовательности в xml. Не уверен, что это то, что вы искали в первую очередь; это кажется мне странным, но я не понимаю требований.

...