使用附加元素验证XML实例
我使用XMLSchema文件来验证传递给web服务的XML实例。我想知道是否有可能在XML实例中有一些可以忽略的其他标记,或者如果字符串与模式“完全”不匹配,它将失败 例如:使用附加元素验证XML实例,xml,.net-3.5,xsd,Xml,.net 3.5,Xsd,我使用XMLSchema文件来验证传递给web服务的XML实例。我想知道是否有可能在XML实例中有一些可以忽略的其他标记,或者如果字符串与模式“完全”不匹配,它将失败 例如: <?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xs:element name="DSSData">
<xs:complexType>
<xs:sequence>
<xs:element name="LTSN" type="xs:string" />
<xs:element name="Timestamp" type="xs:string" />
<xs:element name="Stats" maxOccurs="1" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Trp" type="xs:integer" nillable="true" minOccurs="1" />
<xs:element name="Keyed" type="xs:integer" nillable="true" minOccurs="1" />
<xs:element name="Pieces" type="xs:integer" nillable="true" minOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我传递以下XML字符串:
<DSSData><LTSN>abcd</LTSN><Timestamp></Timestamp><Stats><Trp>12</Trp><Keyed>34</Keyed><Pieces>12</Pieces><Ocr>45</Ocr><OcrNoBC>87</OcrNoBC></Stats></DSSData>
abcd1234124587
添加了新标签
更新:
这是用于验证XML的内容:
bool bIsValid = ValidXMLDoc(my_xml_string, "", "some_schema.xsd");
public bool ValidXmlDoc(string xml, string sSchemaNamespace, string schemaUri)
{
try
{
// Is the xml string valid?
if(xml == null || xml.Length < 1)
{
return false;
}
StringReader srXml = new StringReader(xml);
return ValidXmlDoc(srXml, sSchemaNamespace, schemaUri);
}
catch(Exception ex)
{
this.ValidationError = ex.Message;
return false;
}
}
public bool ValidXmlDoc(StringReader xml, string schemaNamespace, string schemaUri)
{
// Continue?
if(xml == null || schemaNamespace == null || schemaUri == null)
{
return false;
}
isValidXml = true;
XmlValidatingReader vr;
XmlTextReader tr;
XmlSchemaCollection schemaCol = new XmlSchemaCollection();
schemaCol.Add(schemaNamespace, schemaUri);
try
{
// Read the xml.
tr = new XmlTextReader(xml);
// Create the validator.
vr = new XmlValidatingReader(tr);
// Set the validation tyep.
vr.ValidationType = ValidationType.Schema;
// Add the schema.
if(schemaCol != null)
{
vr.Schemas.Add(schemaCol);
}
// Set the validation event handler.
vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// Read the xml schema.
while(vr.Read())
{
}
vr.Close();
return isValidXml;
}
catch(Exception ex)
{
this.ValidationError = ex.Message;
return false;
}
finally
{
// Clean up...
vr = null;
tr = null;
}
}
bool bIsValid=ValidXMLDoc(my_xml_string,“,“some_schema.xsd”);
public bool ValidXmlDoc(字符串xml、字符串名称空间、字符串模式)
{
尝试
{
//xml字符串有效吗?
if(xml==null | | xml.Length<1)
{
返回false;
}
StringReader srXml=新的StringReader(xml);
返回ValidXmlDoc(srXml、sschemanespace、schemaUri);
}
捕获(例外情况除外)
{
this.ValidationError=ex.消息;
返回false;
}
}
public bool ValidXmlDoc(StringReader xml、字符串schemaNamespace、字符串schemaUri)
{
//继续?
if(xml==null | | schemaNamespace==null | | schemaUri==null)
{
返回false;
}
isValidXml=真;
XmlValidatingReader虚拟现实;
XmlTextReader-tr;
XmlSchemaCollection schemaCol=新的XmlSchemaCollection();
schemaCol.Add(schemaNamespace,schemaUri);
尝试
{
//阅读xml。
tr=新的XmlTextReader(xml);
//创建验证器。
vr=新的XmlValidatingReader(tr);
//设置验证tyep。
vr.ValidationType=ValidationType.Schema;
//添加模式。
if(schemaCol!=null)
{
vr.Schemas.Add(schemaCol);
}
//设置验证事件处理程序。
vr.ValidationEventHandler+=新的ValidationEventHandler(ValidationCallBack);
//阅读xml模式。
while(vr.Read())
{
}
vr.Close();
返回isValidXml;
}
捕获(例外情况除外)
{
this.ValidationError=ex.消息;
返回false;
}
最后
{
//清理。。。
vr=null;
tr=null;
}
}
谢谢。它不会生效
您可以将
与processContents=“skip”
或“lax”
一起用作已验证序列中任何未验证标记的占位符
例如,如果希望在序列的末尾允许一个可选的任意未验证标记,可以使用:
<xs:sequence>
<xs:element name="Trp" type="xs:integer" nillable="true" minOccurs="1" />
<xs:element name="Keyed" type="xs:integer" nillable="true" minOccurs="1" />
<xs:element name="Pieces" type="xs:integer" nillable="true" minOccurs="1" />
<xs:any processContents="lax" minOccurs="0"/>
</xs:sequence>
您可以在此中测试验证。我按照建议修改了架构,并通过了以下XML字符串,但验证失败:DSSDHSDEV5/19/2014 12:07:28 PM 10100。它似乎使用了第一个“未声明”元素Ocr,但在OcrNoBC元素上失败了。如果我不知道有多少“未声明”的元素,我该怎么做?您可以在这里测试XSD验证:我明白了。你有两个额外的元素。架构只允许一个。如果您想允许无限制的额外非验证元素,那么您应该将
maxOccurs=“unbounded”
添加到
中。您的最后一个验证示例似乎是在我针对提供验证的链接中的架构运行XML字符串时验证的。但是,在我的代码中它失败了。我用我用来验证XML字符串的函数更新了原来的帖子,但不明白它为什么会失败。它重新运行:“找不到元素“OcrNoBC”的架构信息。”
<DSSData>
<LTSN>abcd</LTSN>
<Timestamp/>
<Stats>
<Trp>12</Trp>
<Keyed>34</Keyed>
<Pieces>12</Pieces>
<newTag>45</newTag>
</Stats>
</DSSData>
<xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>