以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  如何验证接收到的XML是否匹配指定的XSD,我找了三天三夜了,好像没有人知道???  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=24238)


--  作者:Kevin_327
--  发布时间:11/14/2005 4:56:00 PM

--  如何验证接收到的XML是否匹配指定的XSD,我找了三天三夜了,好像没有人知道???
如何验证接收到的XML是否匹配指定的XSD,我找了三天三夜了,好像没有人知道???
--  作者:chenhm66
--  发布时间:11/17/2005 10:52:00 AM

--  
什么意思啊?说清楚点
用的什么工具?从哪里接收的xml文档?
--  作者:98900969r
--  发布时间:11/19/2005 6:46:00 AM

--  
如果不想安装相关的软件,这里有一个在线的验证器:
http://www.w3.org/2001/03/webdata/xsv
可惜只有英文界面。



--  作者:water_mys
--  发布时间:11/21/2005 2:31:00 PM

--  
我也想知道啊,55555555555555
--  作者:xiaoyaozgc
--  发布时间:12/20/2005 3:35:00 PM

--  
我也需要这方面的资料呀,大家谁知道的来说一下呀
--  作者:98900969r
--  发布时间:12/20/2005 4:46:00 PM

--  
想学xml及相关技术,可以安装一个xml工作平台,例如XMLSpy或者Stylus Studio。这些工具提供了编辑各种XML相关文档的图形界面,例如XML,XML Schema, DTD, XSLT,Xquery等,并且提供了相关的处理程序,即实现了用DTD、XSD验证XML文档,用XSLT转换XML文档,用XQeury查询XML文档等功能。

也可以不安装上面说到的工具,而用一些程序开发环境中提供XML的功能。在Windows平台上如果使用Visual Studion 6 需要安装MSXML包,如果使用Visual Studio .NET 2003则可使用 .NET的System.Xml,在Java平台上的开发工具就更多。这些开发环境中有关XML的功能毫不示弱,只有一点不好,就是有关XML文档编辑及使用的图形界面没有那么好。


--  作者:vampire_shirley
--  发布时间:12/21/2005 9:36:00 AM

--  
你可以用XML Spy,打开你的XSD文件然后选择Spy顶部的DTD/Schema选项,里面有生成样例XML文件,模仿样例中的文件头部写,主要是名字空间的一些属性设置,关联上之后你就可以选择Spy顶部的XML文件选项里面的验证来验证你的XML文件了
--  作者:flyfoxs
--  发布时间:1/9/2006 5:50:00 PM

--  
如果一个xml里面有需要验证的信息,使用xml spy打开,如果 没有什么提示就是通过了验证。

否则一定会有错误提示的。


--  作者:custjcy
--  发布时间:1/11/2006 11:25:00 AM

--  
搂主指的应该是编程时如何应该使用什么组件进行xml校验吧?
--  作者:custjcy
--  发布时间:1/11/2006 12:25:00 PM

--  
如果使用的是.net可以的话可以使用:XmlValidatingReader 。

详细见

使用 XmlValidatingReader 根据 XML 架构 (XSD) 进行验证
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconValidationAgainstXSDWithXmlValidatingReader.asp


--  作者:zhangzel
--  发布时间:3/14/2006 11:47:00 AM

--  
java编程的话我是用的xcerses2.3以后的版本校验xml是否合法
--  作者:lx-tamc
--  发布时间:4/26/2006 4:50:00 PM

--  
努力学习中
--  作者:jee89731
--  发布时间:4/29/2006 3:51:00 PM

--  
XMLwriter
随便下载补丁  有中文版的
用这个验证还不错
因为机房SPY 修改注册装不进去

阿门~~~~~~~~~
--  作者:wolfkin
--  发布时间:4/30/2006 9:11:00 AM

--  
我也向大家求教,
DTD就是一个模式文件,在xml文档中可以指明使用这个DTD文件;
我不明白的是如何在xml文档中指明所用的xml schema文件,

我是个初学者,这方面不懂,请哪位大侠指点一下。


--  作者:zhengmaoch
--  发布时间:8/3/2006 9:00:00 AM

--  
[Visual Basic]
Dim doc as XmlDocument = new XmlDocument()
Dim tr as XmlTextReader = new XmlTextReader("Sample.xml")
Dim reader as XmlValidatingReader = new XmlValidatingReader(tr)
doc.Load(reader)
[C#]
XmlDocument doc = new XmlDocument();
XmlTextReader tr = new XmlTextReader("Sample.xml");
XmlValidatingReader reader = new XmlValidatingReader(tr);
doc.Load(reader);
--  作者:frankdou
--  发布时间:11/10/2006 2:32:00 PM

--  Java的
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
            "http://www.w3.org/2001/XMLSchema");
dbf.setAttribute( "http://java.sun.com/xml/jaxp/properties/schemaSource",
            "order.xsd");
DocumentBuilder parser = dbf.newDocumentBuilder();
Document doc = parser.parse("order.xml");
--  作者:tony_1201
--  发布时间:11/21/2006 10:40:00 AM

--  
楼上的那段代码,怎么样才知道是验证通过呢,请指点

--  作者:frankdou
--  发布时间:11/21/2006 10:47:00 AM

--  
如果不符合schema的话,parse就抛异常了,而且会给出哪里校验出错。
--  作者:tony_1201
--  发布时间:11/21/2006 11:06:00 AM

--  
我用完全不相同的结构的一个XSD和XML文件,也会通过
--  作者:frankdou
--  发布时间:11/21/2006 11:15:00 AM

--  
奇怪,我这里不是这样啊
public static void main(String[] args) throws Exception{
  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  dbf.setValidating(true);
  dbf.setNamespaceAware(true);
  dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
            "http://www.w3.org/2001/XMLSchema");
  dbf.setAttribute( "http://java.sun.com/xml/jaxp/properties/schemaSource",
            "Product.xsd");
  Document doc = null;
  DocumentBuilder parser = dbf.newDocumentBuilder();
  doc = parser.parse("product.xml");
 }
product.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.doulei.org/pd"
  xmlns:pd="http://www.doulei.org/pd">
  
  <xsd:element name="Product" type="pd:productType" />
  
  <xsd:complexType name="productType">
   <xsd:sequence>
    <xsd:element name="title" type="xsd:string" />
    <xsd:element name="price" type="xsd:double" />
   </xsd:sequence>
   <xsd:attribute name="id" type="pd:productId" />
  </xsd:complexType>

  <xsd:simpleType name="productId">
     <xsd:restriction base="xsd:string">
         <xsd:pattern value="[A-Z]{3}"/>
     </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>
product.xml
<?xml version="1.0"?>
<pd:Product xmlns:pd="http://www.doulei.org/pd"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.doulei.org/pd
        E:\WorkSpaces\tmp_proj\Business\Product.xsd"
   id="AAA">
 <title>Computer</title>
 <price>20.0</price>
</pd:Product>


--  作者:tony_1201
--  发布时间:11/21/2006 11:26:00 AM

--  
你把XML里随便删除一个元素,还是验证通过的,我刚试过了
--  作者:tony_1201
--  发布时间:11/21/2006 11:28:00 AM

--  
这位兄弟,可以给个QQ号吗,我们QQ交流一下



--  作者:frankdou
--  发布时间:11/21/2006 11:36:00 AM

--  
我用QQ不方便,如果有msn加 neu_frank@hotmail.com。我最近才学schema,有空交流一下。
--  作者:dandanyidian
--  发布时间:11/3/2007 4:01:00 PM

--  
没懂什么意思!
--  作者:juventang
--  发布时间:9/24/2008 6:12:00 PM

--  
/// 阅读器的原理是检查一个文档是否是格式良好的,以及检查文档是否与架构吻合。
/// 如果带验证的阅读器发现一个有严重的格式错误的XML文档,只会触发XmlException异常,它不会触发其它的事件。

下面的方法用于验证XML文档是否符合架构

/// <summary>
    /// Use XML schema to validate XML documents
    /// </summary>
    /// <param name="doc">需要验证的文档</param>
    /// <param name="schemaUrl">schema地址</param>
    /// <returns>是否通过验证</returns>
    public bool ValidateXmlWithSchema(XmlDocument doc, string schemaUrl)
    {

        XmlReaderSettings booksSettings = new XmlReaderSettings();
        //服务器上发布schema,然后调用schema验证传递给服务器的XML
        booksSettings.Schemas.Add("", "http://192.168.1.65/Services/books.xsd");
        booksSettings.ValidationType = ValidationType.Schema;
        //在验证过程中出现任何错误,都会触发ValidationEventHandler事件
        booksSettings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);


        StringBuilder strSql = new StringBuilder();
        strSql.Append("select * from book");


        DataSet ds = new DataSet();

        ds = ClsDb.Retrieve(CommandType.Text, strSql.ToString(), "book");


        XmlDocument doc = new XmlDocument();

        //过滤掉不需要的节点<NewDataSet>
        doc.LoadXml(ds.GetXml().Replace("<NewDataSet>", "").Replace("</NewDataSet>", ""));

        //获取XML的stream
        StringReader stream = null;
        stream = new StringReader(doc.OuterXml);
        //创建XmlReader
        XmlReader books = XmlReader.Create(stream, booksSettings);
        failed = false;
        try
        {
            //流式读取,并验证,验证错误会触发上面注册的事件
            //验证发生在用户用Read方法向前移动指针时,
            //一旦节点被分析和读取,它获得传送过来的处理验证的内部的对象。
            //验证操作是基于节点类型及被要求的验证类型。
            //它确认节点所有的属性和节点包含的子节点是否符合验证条件
            while (books.Read())
            {
                if (failed == true)
                {
                    return false;
                }
            }
            
        }
        catch (XmlException err)
        {
            failed = true;
        }
        finally
        {
            //一定要记得关闭XmlReader,不然会造成独占
            books.Close();
        }
        return !failed;

        ////////////////////////////////////


    }

//如果未提供事件ValidationEventHandler事件处理程序,则抛出一个XML异常
    private void ValidationEventHandler(object sender, ValidationEventArgs args)
    {
        failed = true;
        //记录不符合的验证信息
        InvalidateMeg = "Validation error: " + args.Message;
    }

客户端使用:
提供XML文档和schema 地址 验证所提供的XML文档是否符合架构要求
日过不符合,会提示哪里有错误,操作终止。
try
        {

            if (!vxml.ValidateXmlWithSchema(doc, "schema url"))
            //if (!vxml.ValidateSetXmlWithSchemaUrl())
            {
                TextBox1.Text = vxml.InvalidateMeg;
                return;
            }
            else
            {
                TextBox1.Text =”successful”;
            }

        }
        catch(Exception ex)
        {
            TextBox1.Text = ex.Message;

        }


--  作者:xujian2009
--  发布时间:12/14/2009 3:18:00 PM

--  
写的很详细,有时间能交流交流吗?
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
152.344ms