Как проверить XML с «minOccurs» в Java? - PullRequest
0 голосов
/ 12 ноября 2018

Я использую javax.xml.validation.Validator для проверки xml по схеме. У меня есть требование, когда входной xml содержит поля 'minOccurs' и 'maxOccurs'. Если я проверяю это по схеме, я получаю org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 7; cvc-complex-type.3.2.2: Attribute 'minOccurs' is not allowed to appear in element. Как решить эту проблему?

Проверка:

URL url;
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
url = classLoader.getResource(schemaLocation);
String xsd = url.toURI().getPath();
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
File f = new File(xsd);
schema = factory.newSchema(f);
Validator valid = schema.newValidator();
StringReader xml = new StringReader(request);
valid.validate(new StreamSource(xml));
xml.close();

XSD:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="order">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="item">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema> 

XML:

<order>  
  <item>
    <name minoccurs="1" maxOccurs="unbounded">apple</name>   
  </item>
</order> 

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Не следует указывать minoccurs="1" maxOccurs="unbounded" в имени элемента xml.

Что вам нужно:

<order>  
  <item>
    <name>apple</name>   
  </item>
</order>

С вашим текущим кодом он ищет атрибуты minoccurs и maxOccurs, которые вы не определили в своем файле xsd.

Редактировать:

Если вы хотите использовать minOccurs и maxOccurs в качестве атрибутов вашего элемента name и сохранить <name minOccurs="1" maxOccurs="unbounded">apple</name> тогда вам нужно объявить эти атрибуты в вашем XSD следующим образом.

<xs:complexType>
    <xs:sequence>
        <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="minOccurs" type="xs:integer"/>
    <xs:attribute name="maxOccurs" type="xs:integer"/>
</xs:complexType>
0 голосов
/ 12 ноября 2018

Попытка проверить ваш XML еще раз с предоставленным XSD приведет к следующей ошибке:

Атрибут 'minoccurs' не может отображаться в элементе 'element'.

XSD-индикаторы спецификация говорит о том, что индикаторы появления:

maxOccurs

MinOccurs

с заглавными буквами 'O'

Измените свой XSD на:

<xs:sequence>
    <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>

И ваш XML для:

<order>  
  <item>
    <name>apple</name>   
  </item>
</order>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...