使用Java代码进行XML验证 [英] XML validation using Java Code

查看:136
本文介绍了使用Java代码进行XML验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一些代码示例,它显示了如何根据模式验证xml文件。以下是我的XML文档:

I need some code sample which shows how I can validate a xml file against a schema. Below is my XML document:

<birthdate>
    <month>January</month>
    <day>21</day>
    <year>1983</year>
</birthdate>

我要验证上述XML的架构是:

The schema against which I want to validate the above XML is:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://www.w3.org/XML/1998/namespace"
        schemaLocation="http://www.w3.org/2001/xml.xsd" />

  <xs:element name="birthdate">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="month" type="xs:string" />
        <xs:element name="day" type="xs:int" />
        <xs:element name="year" type="xs:int" />
      </xs:sequence>  
    </xs:complexType>
  </xs:element>
</xs:schema>

现在有人可以帮助我编写Java代码,将这些作为输入并提供正确的输出根据我指定的模式,XML文档是有效的吗?

Now can some one help me write the Java code that will take these as input and give proper output if the XML doc is a valid as per the schema I specified?

现在我有理解下面的代码,比如MySAXHandler上的方法如何调用becoz类不是实例化和方法不是明确调用的。
有人可以解释一下吗?
并且还有任何方式我可以直接传递文件而不是通过字符串。

Now i have issue understanding the below code like how the methods on MySAXHandler are getting calling becoz the class is not instantiated and methods are not called explicitely. Can anyone explain? And also is there any way i can pass the files direcly instead of passing through Strings.

代码是 -

import java.io.StringReader;

import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.validation.SchemaFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

public class XMLval {
  public static void main(String args[])throws Exception {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser parser = null;
    spf.setNamespaceAware(true);
    try {
     SchemaFactory sf =
                     SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     spf.setSchema(sf.newSchema(new SAXSource(new InputSource(new StringReader(schemaString)))));
 parser = spf.newSAXParser();
}
catch(SAXException e) {
  e.printStackTrace(System.err);
  System.exit(1);    
} 
catch(ParserConfigurationException e) {
  e.printStackTrace(System.err);
  System.exit(1);    
}
MySAXHandler handler = new MySAXHandler(); 
System.out.println(schemaString);
parser.parse(new InputSource(new StringReader(xmlString)), handler);


}



static String xmlString = "<?xml version=\"1.0\"?>" +
  "<birthdate>" +
  "<month>January</month>" +
  "<day>21</day>" +
  "<year>1983</year>" +
  "</birthdate>";



static String schemaString ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +

  "<xs:element name=\"birthdate\">" +
  "<xs:complexType>" +
  "<xs:sequence>" +
  "<xs:element name=\"month\" type=\"xs:string\"/>" +
  "<xs:element name=\"day\" type=\"xs:int\"/>" +
  "<xs:element name=\"year\" type=\"xs:int\" />" +
  "</xs:sequence>" +
                  "</xs:complexType>" +
                  "</xs:element>" +
                  "</xs:schema>";
}

class MySAXHandler extends DefaultHandler {
  public void startDocument() {
    System.out.println("Start document: ");
  }    
    public void endDocument()  {
    System.out.println("End document: ");
  }

  public void startElement(String uri, String localName, String qname, 
                                                               Attributes attr)
  {
    System.out.println("Start element: local name: " + localName + " qname: " 
                                                        + qname + " uri: "+uri);
    int attrCount = attr.getLength();
    if(attrCount>0) {
      System.out.println("Attributes:"); 
      for(int i = 0 ; i<attrCount ; i++) {
        System.out.println("  Name : " + attr.getQName(i)); 
        System.out.println("  Type : " + attr.getType(i)); 
        System.out.println("  Value: " + attr.getValue(i)); 
      }
    } 
  }

  public void endElement(String uri, String localName, String qname) {
    System.out.println("End element: local name: " + localName + " qname: "
                                                         + qname + " uri: "+uri);
  }

  public void characters(char[] ch, int start, int length) {
    System.out.println("Characters: " + new String(ch, start, length));
  }
}


推荐答案

你可以试用JDOM库。

You can try JDOM library.

http ://www.jdom.org/docs/faq.html#a0360

这篇关于使用Java代码进行XML验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆