读书人

求高手路过用java根据xsd验证xml有关

发布时间: 2012-12-16 12:02:32 作者: rapoo

求高手路过,用java根据xsd验证xml问题
java端验证代码:


/**
* validateXML
* @param xsdPath 传入验证文件
* @param xmlData 传入验证内容
* @return
*/
public static boolean validateXML(String xsdPath,String xmlData){
// 建立schema工厂
SchemaFactory schemaFactory = SchemaFactory
.newInstance("http://www.w3.org/2001/XMLSchema");

// 建立验证文档文件对象,利用此文件对象所封装的文件进行schema验证
File schemaFile = new File(xsdPath);

// 利用schema工厂,接收验证文档文件对象生成Schema对象
Schema schema = null;
try {
schema = schemaFactory.newSchema(schemaFile);
} catch (SAXException e) {
e.printStackTrace();
}

// 通过Schema产生针对于此Schema的验证器,利用schenaFile进行验证
Validator validator = schema.newValidator();

// 得到验证的数据源
Source source = new StreamSource(String2InputStream(xmlData));

// 开始验证,成功输出success!!!,失败输出fail
// 参数还可以用文件的String转为的inputstreamnew
// //ByteArrayInputStream(text.getBytes("UTF-8"));
try {
validator.validate(source);
}catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
return false;
}
return true;
}


xsd规则文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="List" type="ListType"/>
<xs:complexType name="ListType">
<xs:sequence>
<xs:element type="DomainType" name="Domain"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DomainType">
<xs:sequence>
<xs:element type="xs:int" name="aac001"/>
<xs:element type="xs:long" name="aac002"/>
<xs:element type="xs:string" name="aac003"/>
</xs:sequence>
</xs:complexType>
</xs:schema>


xml数据文件代码:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<List>
<Domain xsi:type="person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<aac001>3001415722</aac001>
<aac002>54xxx965070xx20</aac002>
<aac003>我靠靠</aac003>
</Domain>
</List>


根据上述代码进行验证Xml时报出异常:

Cannot resolve 'person' to a type definition for element 'Domain'.

找了半天不知道怎样定义xsd 才能让代码验证通过。求高手指导一下
[最优解释]
<aac001>3001415722</aac001>
<aac002>54xxx965070xx20</aac002>

这地方里面2个值类型和你定义的xsd 值不匹配啊。。
第一行超出int超出int类型取值范围,
第二行值明显不是long类型数据值

------其他解决方案--------------------


validateXML方法中还用到了 一个 String2InputStream方法 ,代码如下:


/**
* 将字符串转换为流对象
* @param str 需要装的字符串
* @return 返回流对象
* @since CodingExample Ver(编码范例查看) 1.1
*/
private static InputStream String2InputStream(String str){
ByteArrayInputStream stream =null;
try {
stream = new ByteArrayInputStream(str.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stream;
}
[其他解释]
xsi:type="person"出现的有点奇怪,改成这样试试:



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<List xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Domain >
<aac001>3001415722</aac001>
<aac002>54xxx965070xx20</aac002>
<aac003>我靠靠</aac003>
</Domain>
</List>

[其他解释]
嘿嘿,问题解决了,谢谢楼上的两位师兄

读书人网 >Java相关

热点推荐