高分求助:怎么用xsd验证xml文件呢?

千山独行 2003-09-27 05:46:42
我的问题具体如下:
在server端已经有了一个xsd文件作为规范,客户会给管理员发送一个xml文件做注册之用.管理员在往数据库里写数据之前,需要先用server端的xsd文件对xml文件做一个验证,是否是符合xsd规范的.
对于程序的要求就是:
输入两个文件作为参数,xml文件和xsd文件,经过验证,最后输出该xml文件是否是符合xsd规范的文件.
注意:xml文件里可能没有引用xsd规范
我是否要先把xsd规范写入xml文件里呢?
...全文
203 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
argen 2004-01-30
  • 打赏
  • 举报
回复
you need xercesImpl.jar and xmlParserApis.jar in your classpath
千山独行 2003-10-04
  • 打赏
  • 举报
回复
为什么呢?是不是xml文件里也一定要指定使用的schema?我的xml文件仅仅是这样:
<?xml version="1.0" encoding="UTF-8"?>
...
wuxk 2003-09-29
  • 打赏
  • 举报
回复

不会是地址的问题的。你应该把你的xml文件贴出来看看。
千山独行 2003-09-28
  • 打赏
  • 举报
回复
private static class MyErrorHandler implements ErrorHandler {
private PrintWriter out;

MyErrorHandler(PrintWriter out) {
this.out = out;
}
private String getParseExceptionInfo(SAXParseException spe) {
String systemId = spe.getSystemId();
if (systemId == null) {
systemId = "null";
}
String info = "URI=" + systemId +
" Line=" + spe.getLineNumber() +
": " + spe.getMessage();
return info;
}
public void warning(SAXParseException spe) throws SAXException {
out.println("Warning: " + getParseExceptionInfo(spe));
}

public void error(SAXParseException spe) throws SAXException {
String message = "Error: " + getParseExceptionInfo(spe);
throw new SAXException(message);
}

public void fatalError(SAXParseException spe) throws SAXException {
String message = "Fatal Error: " + getParseExceptionInfo(spe);
throw new SAXException(message);
}
}
}
千山独行 2003-09-28
  • 打赏
  • 举报
回复
下面是代码:
// JAXP packages
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
import java.io.*;
public class DOMEcho {
static final String outputEncoding = "UTF-8";
private PrintWriter out;
private int indent = 0;
private final String basicIndent = " ";
static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
DOMEcho(PrintWriter out) {
this.out = out;
}
private void printlnCommon(Node n) {
out.print(" nodeName=\"" + n.getNodeName() + "\"");
String val = n.getNamespaceURI();
if (val != null) out.print(" uri=\"" + val + "\"");
val = n.getPrefix();
if (val != null) out.print(" pre=\"" + val + "\"");
val = n.getLocalName();
if (val != null) out.print(" local=\"" + val + "\"");
val = n.getNodeValue();
if (val != null) {
out.print(" nodeValue=");
if (val.trim().equals("")) {
// Whitespace
out.print("[WS]");
} else {
out.print("\"" + n.getNodeValue() + "\"");
}
}
out.println();
}
private void outputIndentation() {
for (int i = 0; i < indent; i++) {
out.print(basicIndent);
}
}
private void echo(Node n) {
outputIndentation();

int type = n.getNodeType();
switch (type) {
case Node.ATTRIBUTE_NODE:
out.print("ATTR:");
printlnCommon(n);
break;
case Node.CDATA_SECTION_NODE:
out.print("CDATA:");
printlnCommon(n);
break;
case Node.COMMENT_NODE:
out.print("COMM:");
printlnCommon(n);
break;
case Node.DOCUMENT_FRAGMENT_NODE:
out.print("DOC_FRAG:");
printlnCommon(n);
break;
case Node.DOCUMENT_NODE:
out.print("DOC:");
printlnCommon(n);
break;
case Node.DOCUMENT_TYPE_NODE:
out.print("DOC_TYPE:");
printlnCommon(n);

// Print entities if any
NamedNodeMap nodeMap = ((DocumentType)n).getEntities();
indent += 2;
for (int i = 0; i < nodeMap.getLength(); i++) {
Entity entity = (Entity)nodeMap.item(i);
echo(entity);
}
indent -= 2;
break;
case Node.ELEMENT_NODE:
out.print("ELEM:");
printlnCommon(n);

NamedNodeMap atts = n.getAttributes();
indent += 2;
for (int i = 0; i < atts.getLength(); i++) {
Node att = atts.item(i);
echo(att);
}
indent -= 2;
break;
case Node.ENTITY_NODE:
out.print("ENT:");
printlnCommon(n);
break;
case Node.ENTITY_REFERENCE_NODE:
out.print("ENT_REF:");
printlnCommon(n);
break;
case Node.NOTATION_NODE:
out.print("NOTATION:");
printlnCommon(n);
break;
case Node.PROCESSING_INSTRUCTION_NODE:
out.print("PROC_INST:");
printlnCommon(n);
break;
case Node.TEXT_NODE:
out.print("TEXT:");
printlnCommon(n);
break;
default:
out.print("UNSUPPORTED NODE: " + type);
printlnCommon(n);
break;
}
indent++;
for (Node child = n.getFirstChild(); child != null;
child = child.getNextSibling()) {
echo(child);
}
indent--;
}

private static void usage() {
System.err.println("Usage: DOMEcho [-options] <file.xml>");
System.err.println(" -dtd = DTD validation");
System.err.println(" -xsd | -xsdss <file.xsd> = W3C XML Schema validation using xsi: hints");
System.err.println(" in instance document or schema source <file.xsd>");
System.err.println(" -ws = do not create element content whitespace nodes");
System.err.println(" -co[mments] = do not create comment nodes");
System.err.println(" -cd[ata] = put CDATA into Text nodes");
System.err.println(" -e[ntity-ref] = create EntityReference nodes");
System.err.println(" -usage or -help = this message");
System.exit(1);
}

public static void main(String[] args) throws Exception {
String filename = null;
boolean dtdValidate = false;
boolean xsdValidate = false;
String schemaSource = null;

boolean ignoreWhitespace = false;
boolean ignoreComments = false;
boolean putCDATAIntoText = false;
boolean createEntityRefs = false;

for (int i = 0; i < args.length; i++) {
if (args[i].equals("-dtd")) {
dtdValidate = true;
} else if (args[i].equals("-xsd")) {
xsdValidate = true;
} else if (args[i].equals("-xsdss")) {
if (i == args.length - 1) {
usage();
}
xsdValidate = true;
schemaSource = args[++i];
} else if (args[i].equals("-ws")) {
ignoreWhitespace = true;
} else if (args[i].startsWith("-co")) {
ignoreComments = true;
} else if (args[i].startsWith("-cd")) {
putCDATAIntoText = true;
} else if (args[i].startsWith("-e")) {
createEntityRefs = true;
} else if (args[i].equals("-usage")) {
usage();
} else if (args[i].equals("-help")) {
usage();
} else {
filename = args[i];

// Must be last arg
if (i != args.length - 1) {
usage();
}
}
}
if (filename == null) {
usage();
}

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(dtdValidate || xsdValidate);
if (xsdValidate) {
try {
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
} catch (IllegalArgumentException x) {
x.printStackTrace();
System.exit(1);
}
}

if (schemaSource != null) {
dbf.setAttribute(JAXP_SCHEMA_SOURCE, new File(schemaSource));
}

dbf.setIgnoringComments(ignoreComments);
dbf.setIgnoringElementContentWhitespace(ignoreWhitespace);
dbf.setCoalescing(putCDATAIntoText);
dbf.setExpandEntityReferences(!createEntityRefs);

DocumentBuilder db = dbf.newDocumentBuilder();
OutputStreamWriter errorWriter = new OutputStreamWriter(System.err, outputEncoding);
db.setErrorHandler(new MyErrorHandler(new PrintWriter(errorWriter, true)));
Document doc = db.parse(new File(filename));
OutputStreamWriter outWriter = new OutputStreamWriter(System.out, outputEncoding);
new DOMEcho(new PrintWriter(outWriter, true)).echo(doc);
}
千山独行 2003-09-28
  • 打赏
  • 举报
回复
我是用java来解析xml,我这里现在有一段源代码例程,如下,但是这段代码编译可以通过,无法运行,运行显示下面的错误:
java.lang.IllegalArgumentException: No attributes are implemented
at org.apache.crimson.jaxp.DocumentBuilderFactoryImpl.setAttribute(DocumentBuilderFactoryImpl.java:93)
at domecho.DOMEcho.main(DOMEcho.java:235)
我觉得是JAXP_SCHEMA_LANGUAGE,JAXP_SCHEMA_SOURCE两个常量的值有错误,哪位大侠能给出正确的url地址?

_17708668 2003-09-27
  • 打赏
  • 举报
回复

xsd是对xml文件的架构(或说模式,schema)定义,有架构定义的xml文件被称为"有效的"(而不仅仅是合乎语法的)xml文件。

要使成为"有效的"xml文件,应在XML文件头部引用其架构文件,即它的相应xsd文件。

对Xml的架构校验,在表现形式上,不同的实现有不同的方法。若有兴趣,请参考MSDN上的

XmlValidatingReader 概述(自已找中文版吧,如果不想看英文)

saucer 2003-09-27
  • 打赏
  • 举报
回复
different environment has their own syntax, what kind of development environment are you using? if you are using MSXML, see
http://msdn.microsoft.com/library/en-us/xmlsdk/htm/xsd_devgd_hdi_validate_1pet.asp?frame=true

or use XMLValidatingReader if you are using .NET:
http://www.15seconds.com/issue/021022.htm

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧