2017-01-02 2 views
0

Мне нужно сделать двойную проверку с помощью значения атрибута элемента xml.Повторяющаяся проверка внутри элемента xml

Пример ввода запроса:

<Parent> 
    <child id="1"> test 1</child> 
    <child id="1"> test 2</child> 
    <child id="2"> test 3</child> 
</parent> 

Я хочу найти дубликаты идентификатор, который присутствует в детском атрибуту элемента в запросе XML с помощью XSD или какой-то другой путь будет fine.Anyone, пожалуйста, помогите мне, чтобы обнаружить повторяющиеся элементы значение атрибута.

+0

Вы проверили: http://stackoverflow.com/questions/2386633/how-do-i-ensure-unique-element-values-in-an-xml-schema – HRgiger

ответ

1

В основном вам необходимо использовать xsd:unique для обеспечения уникальности элемента или атрибута. Ниже приводится выдержка из ссылки:

Указывает, что значение атрибута или элемента (или комбинацию атрибутов или элементов значений) должен быть уникальным в пределах указанного объема . Значение должно быть уникальным или равно нулю.

В случае, если вы не знаете, то вам нужно создать XSD/DTD с помощью которого вы можете применять эту уникальность, а затем подтвердить свой XML против этой XSD/DTD, используя любой из доступных XML парсер. Ниже приведен пример Java вместе с XSD.

Ваше заявление в вопрос:

запрос XML с помощью XSD или какой-либо другой способ, было бы хорошо

По Насколько мне известно, если вы хотите, чтобы проверить XML-документ для его действия, то вы ДОЛЖНЫ иметь либо XSD, либо DTD, нет другого способа, которым вы можете это сделать, без XSD или DTD (или менее известного RELAX NG). Итак, все, что вам нужно сделать, это написать XSD или DTD, который определяет ожидаемую структуру вашего XML-документа, а затем с помощью некоторого средства проверки XML для проверки вашего XML-документа на этот XSD/DTD, и он расскажет вам, придерживается ли ваш XML-документ XSD/DTD или нет. Подводя итог, вам нужно написать/указать XSD/DTD, который определяет ожидаемую структуру вашего XML-документа.

Ваш XML: "so.xml"

<Parent> 
    <child id="1"> test 1</child> 
    <child id="2"> test 2</child> 
    <child id="2"> test 3</child> 
</Parent> 

образца XSD вам нужно (с XSD: уникальный для вашего требования): "so.xsd"

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="Parent"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="child" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:simpleContent> 
          <xs:extension base="xs:string"> 
           <xs:attribute name="id" type="xs:token" use="required"/> 
          </xs:extension> 
         </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    <!-- This is the solution of your problem - "xs:unique" --> 
    <xs:unique name="unique-id"> 
      <xs:selector xpath="child"/> 
      <xs:field xpath="@id"/> 
     </xs:unique> 
    </xs:element> 
</xs:schema> 

Пример кода Java для проверки:

import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException; 
import org.xml.sax.InputSource; 


import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.StringReader; 


import javax.xml.XMLConstants; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Source; 

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

public class XmlSchemaValidationHelper { 

    public static void main(String[] argv) { 
     XmlSchemaValidationHelper schemaValidationHelper = new XmlSchemaValidationHelper(); 
     schemaValidationHelper.validateAgainstSchema(new File(argv[0]), new File(argv[1])); 
    } 

    public void validateAgainstSchema(File xmlFile, File xsdFile) { 
     try { 
      System.out.println("### Starting..."); 
      // parse an XML document into a DOM tree 
      DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
      builderFactory.setNamespaceAware(true); 
      DocumentBuilder parser = builderFactory.newDocumentBuilder(); 
      Document document = parser.parse(xmlFile); 

      // 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(xsdFile); 
      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 
      validator.validate(new DOMSource(document)); 
      System.out.println("### Finished..."); 

     } catch (FileNotFoundException ex) { 
      throw new OpenClinicaSystemException("File was not found", ex.getCause()); 
     } catch (IOException ioe) { 
      throw new OpenClinicaSystemException("IO Exception", ioe.getCause()); 
     } catch (SAXParseException spe) { 
      spe.printStackTrace(); 
      throw new OpenClinicaSystemException("Line : " + spe.getLineNumber() + " - " + spe.getMessage(), spe.getCause()); 
     } catch (SAXException e) { 
      throw new OpenClinicaSystemException(e.getMessage(), e.getCause()); 
     } catch (ParserConfigurationException pce) { 
      throw new OpenClinicaSystemException(pce.getMessage(), pce.getCause()); 
     } 
    } 

    public class OpenClinicaSystemException extends RuntimeException { 
     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 
     private String errorCode; 
     private Object[] errorParams; 

     public OpenClinicaSystemException(String code, String message) { 
      this(message); 
      this.errorCode = code; 
     } 

     public OpenClinicaSystemException(String code, String message, Throwable cause) { 
      this(message, cause); 
      this.errorCode = code; 
     } 

     public OpenClinicaSystemException(String message, Throwable cause) { 
      super(message, cause); 
     } 

     public OpenClinicaSystemException(Throwable cause) { 
      super(cause); 
     } 

     public OpenClinicaSystemException(String message) { 
      super(message); 
      this.errorCode = message; 
     } 

     public OpenClinicaSystemException(String code, Object[] errorParams) { 
      this.errorCode = code; 
      this.errorParams = errorParams; 
     } 

     public OpenClinicaSystemException(String code, Object[] errorParams, String message) { 
      this(message); 
      this.errorCode = code; 
      this.errorParams = errorParams; 
     } 

     public String getErrorCode() { 
      return errorCode; 
     } 

     public Object[] getErrorParams() { 
      return errorParams; 
     } 

     public void setErrorParams(Object[] errorParams) { 
      this.errorParams = errorParams; 
     } 
    } 

} 

Вы можете запустить эту программу - java XmlSchemaValidationHelper so.xml so.xsd

Смежные вопросы