一:关于XML文档用XMLSchema验证:
1 XML文档中必须添加命名空间:如果没有添加,则要在验证前,给XML文档以code的方式添加进去,总之,要验证XML文档必须添加命名空间
2 命名空间必须和XMLSchema中的命名空间一致。
1 XML文档
这个是XML的命名空间,如要验证,则必须添加(可以在XML文档中直接添加,也可以验证的时候在代码中添加)
<?xml version=
"
1.0
" encoding=
"
utf-8
" ?>
<SectionTables xmlns= " http://tempuri.org/SectionTableUpload.xsd ">
<SectionTable Name = " NameXXX " MCType= " MCTypeXXX " >
<SubTable Rootstr= "RootstrXXX " >
<SectionTables xmlns= " http://tempuri.org/SectionTableUpload.xsd ">
<SectionTable Name = " NameXXX " MCType= " MCTypeXXX " >
<SubTable Rootstr= "RootstrXXX " >
<
Expression
>No Expression
</
Expression
>
<Parameter key= " Key1 " value= " Value1 " ></Parameter >
<Parameter key= " Key2 " value= " Value2 " ></Parameter >
<Parameter key= " Key3 " value= "Value3 " ></Parameter >
</SubTable >
</SectionTable>
</SectionTables>
<Parameter key= " Key1 " value= " Value1 " ></Parameter >
<Parameter key= " Key2 " value= " Value2 " ></Parameter >
<Parameter key= " Key3 " value= "Value3 " ></Parameter >
</SubTable >
</SectionTable>
</SectionTables>
2 XSD文档
targetNamespace=http://tempuri.org/SectionTableUpload.xsd就是XML文档中要引用的命名空间
<?xml version=
"
1.0
" encoding=
"
utf-8
"?>
<xs:schema id= " SectionTableUpload "
targetNamespace= " http://tempuri.org/SectionTableUpload.xsd "
elementFormDefault= " qualified "
xmlns= " http://tempuri.org/SectionTableUpload.xsd "
xmlns:mstns= " http://tempuri.org/SectionTableUpload.xsd "
xmlns:xs= " http://www.w3.org/2001/XMLSchema "
>
<xs:element name= " SectionTables ">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs= " unbounded " ref= " SectionTable "/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name= " SectionTable ">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs= " unbounded " ref= " SubTable "/>
</xs:sequence>
<xs:attribute name= " MCType " use= " required "/>
<xs:attribute name= " Name " use= " required " type= " xs:NCName "/>
</xs:complexType>
</xs:element>
<xs:element name= " SubTable ">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs= " 0 " ref= " Expression "/>
<xs:element maxOccurs= " unbounded " ref= " Parameter "/>
</xs:sequence>
<xs:attribute name= " Rootstr " use= " required "/>
</xs:complexType>
</xs:element>
<xs:element name= " Expression " type= " xs:string "/>
<xs:element name= " Parameter ">
<xs:complexType>
<xs:attribute name= " key " use= " required " type= " xs:NCName "/>
<xs:attribute name= " value " use= " required "/>
</xs:complexType>
</xs:element>
</xs:schema>
<xs:schema id= " SectionTableUpload "
targetNamespace= " http://tempuri.org/SectionTableUpload.xsd "
elementFormDefault= " qualified "
xmlns= " http://tempuri.org/SectionTableUpload.xsd "
xmlns:mstns= " http://tempuri.org/SectionTableUpload.xsd "
xmlns:xs= " http://www.w3.org/2001/XMLSchema "
>
<xs:element name= " SectionTables ">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs= " unbounded " ref= " SectionTable "/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name= " SectionTable ">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs= " unbounded " ref= " SubTable "/>
</xs:sequence>
<xs:attribute name= " MCType " use= " required "/>
<xs:attribute name= " Name " use= " required " type= " xs:NCName "/>
</xs:complexType>
</xs:element>
<xs:element name= " SubTable ">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs= " 0 " ref= " Expression "/>
<xs:element maxOccurs= " unbounded " ref= " Parameter "/>
</xs:sequence>
<xs:attribute name= " Rootstr " use= " required "/>
</xs:complexType>
</xs:element>
<xs:element name= " Expression " type= " xs:string "/>
<xs:element name= " Parameter ">
<xs:complexType>
<xs:attribute name= " key " use= " required " type= " xs:NCName "/>
<xs:attribute name= " value " use= " required "/>
</xs:complexType>
</xs:element>
</xs:schema>
3验证方式
public
static
bool ValidateXML(XmlDocument xmlFile, XmlDocument schemaFile)
{
bool isValid = true;
try
{
if (xmlFile.DocumentElement.Attributes[ " xmlns "] == null)
{
xmlFile.DocumentElement.SetAttribute( " xmlns ", " http://tempuri.org/SectionTableUpload.xsd ");
}
if(xmlFile.DocumentElement.Attributes[ " xmlns "].Value!= " http://tempuri.org/SectionTableUpload.xsd ")
{
isValid = false;
throw new Exception( " Error nameplace ");
}
XmlNodeReader xmlFileReader = new XmlNodeReader(xmlFile);
XmlNodeReader schemaFilesReader = new XmlNodeReader(schemaFile);
XmlReaderSettings schemaFilereaderSetting = new XmlReaderSettings();
XmlReader schemaFileReader = XmlReader.Create(schemaFilesReader, schemaFilereaderSetting);
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add( null, schemaFileReader);
XmlReaderSettings readerSetting = new XmlReaderSettings();
readerSetting.ValidationType = ValidationType.Schema;
readerSetting.Schemas = schemaSet;
using (XmlReader xmlReader = XmlReader.Create(xmlFileReader, readerSetting))
{
while (xmlReader.Read()) { }
}
}
catch (Exception ex)
{
isValid = false;
throw ex;
}
return isValid;
}
{
bool isValid = true;
try
{
if (xmlFile.DocumentElement.Attributes[ " xmlns "] == null)
{
xmlFile.DocumentElement.SetAttribute( " xmlns ", " http://tempuri.org/SectionTableUpload.xsd ");
}
if(xmlFile.DocumentElement.Attributes[ " xmlns "].Value!= " http://tempuri.org/SectionTableUpload.xsd ")
{
isValid = false;
throw new Exception( " Error nameplace ");
}
XmlNodeReader xmlFileReader = new XmlNodeReader(xmlFile);
XmlNodeReader schemaFilesReader = new XmlNodeReader(schemaFile);
XmlReaderSettings schemaFilereaderSetting = new XmlReaderSettings();
XmlReader schemaFileReader = XmlReader.Create(schemaFilesReader, schemaFilereaderSetting);
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add( null, schemaFileReader);
XmlReaderSettings readerSetting = new XmlReaderSettings();
readerSetting.ValidationType = ValidationType.Schema;
readerSetting.Schemas = schemaSet;
using (XmlReader xmlReader = XmlReader.Create(xmlFileReader, readerSetting))
{
while (xmlReader.Read()) { }
}
}
catch (Exception ex)
{
isValid = false;
throw ex;
}
return isValid;
}
二:XML中节点的筛选:
添加命名空间以后,SelectSingleNode方法获取节点就需要添加命名空间来获取。
比如,上面的xml文档添加了命名空间,则现在就要这样获取节点
方法1:添加命名空间获取:
XmlElement root = xmlDoc.DocumentElement;
//没有添加命名空间的时候,这样获取
XmlNode node = root.SelectSingleNode(
"
/SectionTables/SectionTable[@Name='NameXXX']
");
//添加了命名空间后这样获取
XmlNamespaceManager nsmgr =
new XmlNamespaceManager();
nsmgr.AddNamespace( " abc ", " http://tempuri.org/SectionTableUpload.xsd ");
nsmgr.AddNamespace( " abc ", " http://tempuri.org/SectionTableUpload.xsd ");
XmlNode node = root.SelectSingleNode(
"
/abc:SectionTables/abc:SectionTable[@Name='NameXXX']
", nsmgr);
方法2 :将命名空间用replace方式去掉
xmlDoc.InnerXml = xmlDoc.InnerXml.ToString().Replace(
"
xmlns=
" +
"
\"
" +
"
http://tempuri.org/SectionTableUpload.xsd
" +
"
\"
",
"
");
XmlElement root = xmlDoc.DocumentElement;
XmlNode node = root.SelectSingleNode( " /SectionTables/SectionTable[@Name='NameXXX' ] ");
XmlElement root = xmlDoc.DocumentElement;
XmlNode node = root.SelectSingleNode( " /SectionTables/SectionTable[@Name='NameXXX' ] ");
以上总结,供以后查阅