Проверьте недопустимый атрибут в XML по XSD - PullRequest
0 голосов
/ 12 января 2012

Я хочу выяснить любые недопустимые элементы или атрибуты в XML. Я создал XSD-файл из XML с помощью Oxygen XML Editor. Теперь я пытаюсь проанализировать и проверить xml, используя XSD, но мой xml анализирует, даже если я добавлю новый атрибут. Ниже приведен код. Теперь, даже если я добавляю JUNKATTRIBUTE в свой xml, он анализируется. Есть предложения?

Мой код

public static boolean validatehelp(String helpData, helpReport helpReport) {

    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser parser = null;
    spf.setNamespaceAware(true);
    spf.setValidating(true);

    FileReader fileReader = null;
    try {
         SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
         fileReader =  new FileReader("help_xsd.xsd");

         spf.setSchema(sf.newSchema(new SAXSource(new InputSource(fileReader))));
         //spf.setSchema(sf.newSchema(new Source[] {new StreamSource("help_xsd.xsd")}));



        parser = spf.newSAXParser();

        MySAXHandler handler = new MySAXHandler(configReport); 

        parser.parse(new InputSource(new StringReader(helpData)), handler);
        return true;
    }

Мой xml

<Help date="2020-06-24">
<product
id="en_US_SAN_15.0"
label="orange_16.0"
ProductName="orange 16.0 "
productName="orange 16.0 Pre"
productVersion="15.0"
baseUrl="http://help.stage.xyz.com/"
path="Help/en_US/"
ionId="orange_product_xyzlr"
ionCommentingAllowed="yes"
ionSiteArea="help"
ionRatingAllowed="yes"
ionRatingType="thumbs"
searchOptions="Community|xyz"
searchDefault="Community"
searchxyzRefinement="site=orange_V2_all"
="yes"
/>
<package
id="en_US_SAN_15.0_Using"
label="orange_16.0"
path="SAN/orange/15.0/Using"
description="SAN 15.0"
contextSensitivity="yes"
downloadContent="client.orange_V2_Using_en-us.zip"
downloadContentDefault="yes"
downloadPdf="orange_V4_help.pdf"
JUNKATTRIBUTE="JUNK"
/>
</Help>

Мой XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="Help">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="product"/>
        <xs:element ref="package"/>
      </xs:sequence>
      <xs:attribute name="appId" />
      <xs:attribute name="date"  type="xs:date"/>
      <xs:attribute name="locale" type="xs:NCName"/>
      <xs:attribute name="pubId" />
      <xs:attribute name="version"  type="xs:decimal"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="product">
    <xs:complexType>
      <xs:attribute name="baseUrl" type="xs:anyURI"/>
      <xs:attribute name="helpServiceUrl" type="xs:anyURI"/>
      <xs:attribute name="id" type="xs:NCName"/>
      <xs:attribute name="ionCommentingAllowed"  type="xs:NCName"/>
      <xs:attribute name="ionId"  type="xs:NCName"/>
      <xs:attribute name="ionRatingAllowed"  type="xs:NCName"/>
      <xs:attribute name="ionRatingType"  type="xs:NCName"/>
      <xs:attribute name="ionSiteArea"  type="xs:NCName"/>
      <xs:attribute name="label" />
      <xs:attribute name="multidomain"  type="xs:NCName"/>
      <xs:attribute name="path" />
      <xs:attribute name="productName"  type="xs:NCName"/>
      <xs:attribute name="productVersion"  type="xs:NCName"/>
      <xs:attribute name="searchxyzRefinement" />
      <xs:attribute name="searchBlueprintRefinement"  type="xs:NCName"/>
      <xs:attribute name="searchCommunityRefinement"  type="xs:NCName"/>
      <xs:attribute name="searchDefault"  type="xs:NCName"/>
      <xs:attribute name="searchOptions" />
    </xs:complexType>
  </xs:element>
  <xs:element name="package">
    <xs:complexType>
      <xs:attribute name="alias" />
      <xs:attribute name="baseUrl"  type="xs:anyURI"/>
      <xs:attribute name="contextSensitivity"  type="xs:NCName"/>
      <xs:attribute name="deprecated"  type="xs:NCName"/>
      <xs:attribute name="description" />
      <xs:attribute name="downloadContent" />
      <xs:attribute name="downloadContentDefault"  type="xs:NCName"/>
      <xs:attribute name="downloadPdf"  type="xs:NCName"/>
      <xs:attribute name="helpmapPath"  type="xs:anyURI"/>
      <xs:attribute name="id"  type="xs:NCName"/>
      <xs:attribute name="label" />
      <xs:attribute name="packageGenerator"  type="xs:NCName"/>
      <xs:attribute name="path" />
      <xs:attribute name="urlParams" />
    </xs:complexType>
  </xs:element>
</xs:schema>

Ответы [ 2 ]

1 голос
/ 12 января 2012

XML-файл действителен, если:

  • Хорошо сформирован
  • Соответствует любым определенным типам схем, связанных с ним.

В вашем случае XML-документ правильно сформирован, и с ним не связано никакой схемы. Итак, поэтому это действительно.

Если вы хотите связать xml с определенными вами типами, вам нужно использовать пространство имен.

Ваша декларация схемы:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="myNamespaceHere" xmlns="myNamespaceHere">
...
</xs:schema>

Ваш экземпляр xml:

<Help date="2020-06-24" xmlns="myNamespaceHere">
...
</Help>

Теперь, когда вы подтвердите его, ваш синтаксический анализатор узнает, что нужно проверять XSD.

UPDATE

Как отметил Петру в комментариях, эта валидность неверна с точки зрения XSD . Пространство имен на самом деле не требуется для проверки, но в случае, когда пространство имен не требуется, атрибут схемы elementFormDefault должен быть установлен в «неквалифицирован», чтобы указать, что на типы в схеме можно ссылаться без квалификации пространства имен.

Однако парсеры XSD обычно игнорируют экземпляры схемы без пространств имен, поэтому с точки зрения синтаксического анализатора экземпляр xml без пространства имен всегда возвращается как «допустимый» (если он правильно сформирован).

0 голосов
/ 13 января 2012

Исходя из предоставленного вами кода, ваш XML должен проверяться на соответствие предоставленной схеме, однако, поскольку вы не включили определение для MySAXHandler, трудно понять, обрабатываете ли вы 1003 *ошибки, когда они происходят.

За исключением фатальных ошибок, другие ошибки проверки будут сообщаться путем вызова метода DefaultHandler.error() с SAXParseException.Если вы хотите обрабатывать ошибки валидации, вам нужно реализовать этот метод.Что-то вроде:

class MyHandler extends DefaultHandler {
    public void error(SAXParseException exception) throws SAXParseException {
        throw exception;
    }
}

С этим определением обработчика (вместе с остальной частью вашего кода) вы должны увидеть parse throw SAXParseException исключения проверки при их возникновении.ErrorHandler интерфейс см .: http://docs.oracle.com/javase/6/docs/api/org/xml/sax/ErrorHandler.html

...