如何最好地从一种方法测试XML的有效性?
时间:2020-03-06 14:33:36 来源:igfitidea点击:
我有一些WCF方法,用于将信息从服务器应用程序传输到网站前端以进行绑定。我将结果作为XElement发送,该XElement是包含要绑定的数据的XML树的根。
我想创建一些测试来检查数据并确保按预期进行。
我当前的想法是:每个返回XElement树的方法都有一个对应的架构(.XSD)文件。该文件包含在包含我的WCF类作为嵌入式资源的程序集中。
测试在这些方法上调用该方法,并将结果与这些嵌入式模式进行比较。
这是一个好主意吗?如果没有,我可以使用其他什么方法来提供方法将返回哪种XML的"保证"?
如果是这样,我们如何针对模式验证XElement?如何从嵌入的程序集中获取该模式?
解决方案
id说用xsd模式验证xml是个好主意。
如何使用已加载的架构验证XElement:
如本例所示,我们需要先验证XDocument才能填充" schema-validation信息集"(可能有一种解决方案,而无需在XDOcument上使用Validate方法,但是我还没有找到):
String xsd = @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'> <xsd:element name='root'> <xsd:complexType> <xsd:sequence> <xsd:element name='child1' minOccurs='1' maxOccurs='1'> <xsd:complexType> <xsd:sequence> <xsd:element name='grandchild1' minOccurs='1' maxOccurs='1'/> <xsd:element name='grandchild2' minOccurs='1' maxOccurs='2'/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>"; String xml = @"<?xml version='1.0'?> <root> <child1> <grandchild1>alpha</grandchild1> <grandchild2>beta</grandchild2> </child1> </root>"; XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add("", XmlReader.Create(new StringReader(xsd))); XDocument doc = XDocument.Load(XmlReader.Create(new StringReader(xml))); Boolean errors = false; doc.Validate(schemas, (sender, e) => { Console.WriteLine(e.Message); errors = true; }, true); errors = false; XElement child = doc.Element("root").Element("child1"); child.Validate(child.GetSchemaInfo().SchemaElement, schemas, (sender, e) => { Console.WriteLine(e.Message); errors = true; });
如何从程序集中读取嵌入式模式并将其添加到XmlSchemaSet中:
Assembly assembly = Assembly.GetExecutingAssembly(); // you can use reflector to get the full namespace of your embedded resource here Stream stream = assembly.GetManifestResourceStream("AssemblyRootNamespace.Resources.XMLSchema.xsd"); XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add(null, XmlReader.Create(stream));
如果我们正在做一些轻量级的工作,而XSD则显得过大,请考虑也可能强烈地输入XML数据。例如,我在一个项目中有许多从XElement派生的类。一个是ExceptionXElement,另一个是HttpHeaderXElement,以此类推。在其中,我继承自XElement并添加Parse和TryParse方法,这些方法采用包含XML数据的字符串来从中创建实例。如果TryParse()返回false,则字符串不符合我期望的XML数据(根元素名称错误,子元素丢失等)。
例如:
public class MyXElement : XElement { public MyXElement(XElement element) : base(element) { } public static bool TryParse(string xml, out MyXElement myElement) { XElement xmlAsXElement; try { xmlAsXElement = XElement.Parse(xml); } catch (XmlException) { myElement = null; return false; } // Use LINQ to check if xmlAsElement has correct nodes... }