xsd文件校验xml内容

Notepad++方式:

如何安装Notepad++插件:http://jingyan.baidu.com/article/4b07be3c69172648b380f383.html


java代码:

import java.io.File;

import java.util.Iterator;
import java.util.Map;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXValidator;
import org.dom4j.util.XMLErrorHandler;


public class ValidataXML {
public static final String ELEMENT_ALL_LIMITED = "cos-all-limited.2";
public static final String ELEMENT_LOSE = "cvc-complex-type.2.4.a";
public static final String ELEMENT_PATTERN_VALID = "cvc-pattern-valid";
public static final String ELEMENT_REQUIRED_TEXT_LENGTH = "cvc-length-valid";
public static final String ELEMENT_REQUIRED_TEXT_MIN_LENGTH = "cvc-minLength-valid";
public static final String ELEMENT_REQUIRED_TEXT_MAX_LENGTH = "cvc-maxLength-valid";
public static final String ELEMENT_TEXT_VALID = "cvc-type.3.1.3";
public static final String ELEMENT_ENUMERATION = "cvc-enumeration-valid";
public static final String ELEMENT_CHILDREN_LOSE = "cvc-complex-type.2.4.b";
public static final String ELEMENT_REQUIERD_ATTRIBUTE_VALUE_LOSE = "cvc-pattern-valid";
public static final String ELEMENT_OPTIONAL_ATTRIBUTE_VALUE_LOSE = "cvc-attribute.3";
public static final String SINGLE_QUOTE = "'";
public static final String ELEMENT_OPPTIONAL_TEXT_DATATYPE = "cvc-datatype-valid.1.2.1";
public static final String ELEMENT_WITH_ATTRIBUTE_LENGTH = "cvc-complex-type.2.2";
public static final String ELEMENT_ATTRIBUTE_UNIT = "cvc-complex-type.3.1";
public static final String ELEMENT_REQUIRED_ATTRIBUTE_LOSE = "cvc-complex-type.4";


public static String validateXMLByXSD(String xmlScehamDirectory,
String xmlScehmaName, File file) {
String xsdFileName = xmlScehamDirectory + "/" + xmlScehmaName + ".xsd";
try {
XMLErrorHandler errorHandler = new XMLErrorHandler();


SAXParserFactory factory = SAXParserFactory.newInstance();


factory.setValidating(true);


factory.setNamespaceAware(true);


SAXParser parser = factory.newSAXParser();


SAXReader xmlReader = new SAXReader();


Document xmlDocument = xmlReader.read(file);


parser.setProperty(
"http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
parser.setProperty(
"http://java.sun.com/xml/jaxp/properties/schemaSource",
"file:" + xsdFileName);


SAXValidator validator = new SAXValidator(parser.getXMLReader());


validator.setErrorHandler(errorHandler);


validator.validate(xmlDocument);


if (errorHandler.getErrors().hasContent()) {
return "0|" + parseSchemaErrors(errorHandler);
}
return "1";
} catch (Exception ex) {
return "0|" + ex.getMessage();
}
}


public static Map<Boolean, String> validateXMLByXSDExt(
String xmlScehamDirectory, String xmlScehmaName, File file) {
Map<Boolean, String> result = new java.util.HashMap();
String xsdFileName = xmlScehamDirectory + "/" + xmlScehmaName + ".xsd";
try {
XMLErrorHandler errorHandler = new XMLErrorHandler();


SAXParserFactory factory = SAXParserFactory.newInstance();


factory.setValidating(true);


factory.setNamespaceAware(true);


SAXParser parser = factory.newSAXParser();


SAXReader xmlReader = new SAXReader();


Document xmlDocument = xmlReader.read(file);


parser.setProperty(
"http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
parser.setProperty(
"http://java.sun.com/xml/jaxp/properties/schemaSource",
"file:" + xsdFileName);


SAXValidator validator = new SAXValidator(parser.getXMLReader());


validator.setErrorHandler(errorHandler);


validator.validate(xmlDocument);


if (errorHandler.getErrors().hasContent()) {
result.put(Boolean.valueOf(false),
parseSchemaErrors(errorHandler));
} else {
result.put(Boolean.valueOf(true), "");
}
} catch (Exception ex) {
result.put(Boolean.valueOf(false), ex.getMessage());
return result;
}
return result;
}


public static String parseSchemaErrors(XMLErrorHandler errorHandler) {
StringBuffer errors = new StringBuffer();
boolean trag = false;
Document errorDoc = null;
try {
errorDoc = org.dom4j.DocumentHelper.parseText(errorHandler
.getErrors().asXML());
} catch (org.dom4j.DocumentException e) {
e.printStackTrace();
}
Element root = errorDoc.getRootElement();
for (Iterator<Element> iter = root.elementIterator("error"); iter
.hasNext();) {
if (!trag) {
trag = true;
} else {
errors.append("|");
}
Element childElement = (Element) iter.next();
String childMessage = childElement.getText();
System.err.println(childMessage);
if (childMessage.contains("cos-all-limited.2")) {
errors.append(validateAll(childMessage));
} else if (childMessage.contains("cvc-pattern-valid")) {
String nextErrorMsg = ((Element) iter.next()).getText();
errors.append(validatePatternMsg(childMessage, nextErrorMsg));
} else if (childMessage.contains("cvc-length-valid")) {
String nextErrorMsg = ((Element) iter.next()).getText();
errors.append(validateLengthValid(childMessage, nextErrorMsg));
} else if (childMessage.contains("cvc-minLength-valid")) {
String nextErrorMsg = ((Element) iter.next()).getText();
errors.append(validateMinLengthValid(childMessage, nextErrorMsg));
} else if (childMessage.contains("cvc-maxLength-valid")) {
String nextErrorMsg = ((Element) iter.next()).getText();
errors.append(validateMaxLengthValid(childMessage, nextErrorMsg));
} else if (childMessage.contains("cvc-enumeration-valid")) {
String nextErrorMsg = ((Element) iter.next()).getText();
errors.append(validateEnumeration(childMessage, nextErrorMsg));
} else if (childMessage.contains("cvc-datatype-valid.1.2.1")) {
String nextErrorMsg = ((Element) iter.next()).getText();
errors.append(validateDataType(childMessage, nextErrorMsg));
} else if (childMessage.contains("cvc-complex-type.2.4.b")) {
errors.append(validateChildrenLose(childMessage));
} else if (childMessage.contains("cvc-complex-type.4")) {
errors.append(validateRequiredAttributeLose(childMessage));
} else if (childMessage.contains("cvc-complex-type.2.4.a")) {
errors.append(validateElementLose(childMessage));
} else {
errors.append(childMessage);
}
}
return errors.toString();
}


public static String validateAll(String errorMsg) {
try {
int i = errorMsg.lastIndexOf("element");
int j = errorMsg.lastIndexOf("is invalid");
String realMessage = errorMsg.substring(i + 9, j - 2);
return "Schema中元素" + realMessage + "选择器 all 最大/小次数设置错误";
} catch (Exception e) {
}
return errorMsg;
}


public static String validatePatternMsg(String errorMsg, String nextErrorMsg) {
try {
return


getPrefixMsg(nextErrorMsg)
+ " 赋值非法,原因:正则校验不通过.正则表达式为:"
+ errorMsg.substring(errorMsg.lastIndexOf("pattern") + 9,
errorMsg.lastIndexOf("' for type"))
+ " ,当前值:"
+ errorMsg.substring(errorMsg.lastIndexOf("Value '") + 7,
errorMsg.lastIndexOf("' is not facet-valid"));
} catch (Exception e) {
}
return errorMsg;
}


public static String validateLengthValid(String errorMsg,
String nextErrorMsg) {
try {
return


getPrefixMsg(nextErrorMsg)
+ " 长度不正确,原因:要求固定长度为:"
+ errorMsg.substring(
errorMsg.lastIndexOf("respect to length") + 19,
errorMsg.lastIndexOf("' for type"))
+ "位"
+ " ,当前值:"
+ errorMsg.substring(errorMsg.lastIndexOf("Value '") + 7,
errorMsg.lastIndexOf("' with length"));
} catch (Exception e) {
}
return errorMsg;
}


public static String validateMinLengthValid(String errorMsg,
String nextErrorMsg) {
try {
return


getPrefixMsg(nextErrorMsg)
+ " 长度不正确,原因:要求最小长度为:"
+ errorMsg
.substring(
errorMsg.lastIndexOf("respect to minLength '") + 22,
errorMsg.lastIndexOf("' for type"))
+ "位"
+ " ,当前值:"
+ errorMsg.substring(errorMsg.lastIndexOf("Value '") + 7,
errorMsg.lastIndexOf("' with length"));
} catch (Exception e) {
}
return errorMsg;
}


public static String validateMaxLengthValid(String errorMsg,
String nextErrorMsg) {
try {
return


getPrefixMsg(nextErrorMsg)
+ " 长度不正确,原因:要求最大长度为:"
+ errorMsg
.substring(
errorMsg.lastIndexOf("respect to maxLength '") + 22,
errorMsg.lastIndexOf("' for type"))
+ "位"
+ " ,当前值:"
+ errorMsg.substring(errorMsg.lastIndexOf("Value '") + 7,
errorMsg.lastIndexOf("' with length"));
} catch (Exception e) {
}
return errorMsg;
}


public static String validateEnumeration(String errorMsg,
String nextErrorMsg) {
try {
int i = errorMsg.indexOf("[");
int j = errorMsg.indexOf("]");


return getPrefixMsg(nextErrorMsg) + "赋值非法,原因:不在枚举范围内";
} catch (Exception e) {
}
return errorMsg;
}


public static String validateDataType(String errorMsg, String nextErrorMsg) {
try {
int m = errorMsg.lastIndexOf("for");
int n = errorMsg.lastIndexOf("'");
String typeName = errorMsg.substring(m + 5, n);
return getPrefixMsg(nextErrorMsg) + "赋值无效,原因:要求类型为:" + typeName;
} catch (Exception e) {
}
return errorMsg;
}


public static String validateChildrenLose(String errorMsg) {
try {
int m = errorMsg.lastIndexOf("element");
int n = errorMsg.lastIndexOf("' is not complete");
String element = errorMsg.substring(m + 9, n);


int i = errorMsg.lastIndexOf("{");
int j = errorMsg.lastIndexOf("'");
String realMessage = errorMsg.substring(i + 1, j - 1);
return "元素" + element + "不完整,缺少子元素" + realMessage;
} catch (Exception e) {
}
return errorMsg;
}


public static String validateRequiredAttributeLose(String errorMsg) {
try {
int i = errorMsg.indexOf("'");
int j = errorMsg.indexOf("must");
String attributeMessage = errorMsg.substring(i + 1, j - 2);


int m = errorMsg.indexOf("element");
int n = errorMsg.lastIndexOf("'");
String elementMessage = errorMsg.substring(m + 9, n);
return "元素" + elementMessage + "属性" + attributeMessage + "缺失";
} catch (Exception e) {
}
return errorMsg;
}


public static String validateElementLose(String errorMsg) {
try {
int i = errorMsg.lastIndexOf("element");
int j = errorMsg.lastIndexOf("One of ");
return "元素" + errorMsg.substring(i + 9, j - 3) + "异常,冗余或重复";
} catch (Exception e) {
e.printStackTrace();
}
return errorMsg;
}


public static String getPrefixMsg(String nextErrorMsg) throws Exception {
String msg = "元素 ";
if (nextErrorMsg.contains("cvc-type.3.1.3")) {
msg = msg + validateElementTextLength(nextErrorMsg);
} else if (nextErrorMsg.contains("cvc-attribute.3")) {
String[] attrMgs = validateElementAttributeUnit(nextErrorMsg);
msg = msg + attrMgs[1] + "属性 " + attrMgs[0];
}
return msg;
}


public static String validateElementTextLength(String message)
throws Exception {
int i = message.lastIndexOf("element");
int j = message.lastIndexOf("'");
String realMessage = message.substring(i + 9, j);
return realMessage;
}


public static String[] validateElementAttributeUnit(String message)
throws Exception {
int i = message.lastIndexOf("attribute");
int j = message.indexOf("element");
String attributeName = message.substring(i + 11, j - 5);


int n = message.indexOf("is");
String elementName = message.substring(j + 9, n - 2);


int k = message.lastIndexOf("of");
int l = message.lastIndexOf("'");
String unit = message.substring(k + 4, l);


String[] realMessage = { attributeName, elementName, unit };
return realMessage;
}

public static void main(String[] args) {
File file = new File("E:\\XMLWRITE\\Biz42102220160823005078.xml");
//File file = new File("E:\\zz\\xml\\1000301\\Biz500115151030000031.xml");
System.err.println(ValidataXML.validateXMLByXSD("E:\\zz\\xml\\8000101", "8000101", file));

}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java中,可以使用JAXB(Java Architecture for XML Binding)库来解析和校验XML文件。以下是一些步骤: 1. 创建JAXB上下文 首先,需要创建一个JAXB上下文对象。可以通过传递XSD文件路径来创建上下文对象。 ``` JAXBContext jaxbContext = JAXBContext.newInstance("com.example.package"); ``` 2. 创建unmarshaller 接下来,需要从上下文对象中创建一个Unmarshaller对象。Unmarshaller对象将XML文档转换为Java对象。 ``` Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); ``` 3. 设置ValidationEventHandler 设置ValidationEventHandler以捕获XML文件中的错误信息。这将允许您检测XML文件中的任何错误,并根据需要调整节点。 ``` unmarshaller.setEventHandler(new ValidationEventHandler() { public boolean handleEvent(ValidationEvent event) { if (event.getSeverity() == ValidationEvent.FATAL_ERROR || event.getSeverity() == ValidationEvent.ERROR) { System.out.println("Error: " + event.getMessage()); // 在这里根据错误信息调整节点 return false; } else { return true; } } }); ``` 4. 解组XML文件 使用unmarshaller的unmarshal方法解组XML文件,并将其转换为Java对象。 ``` Object obj = unmarshaller.unmarshal(new File("example.xml")); ``` 5. 调整节点并重新验证 如果根据错误信息需要调整节点,请修改Java对象,然后重新验证XML文件。 ``` // 修改Java对象 ... // 重新验证 unmarshaller.setEventHandler(new ValidationEventHandler() { public boolean handleEvent(ValidationEvent event) { if (event.getSeverity() == ValidationEvent.FATAL_ERROR || event.getSeverity() == ValidationEvent.ERROR) { System.out.println("Error: " + event.getMessage()); return false; } else { return true; } } }); obj = unmarshaller.unmarshal(new File("example.xml")); ``` 这些步骤应该可以帮助您根据XSD校验XML格式错误信息调整正确节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值