2008-09-22 38 views
5

我有一些WCF方法用于将信息从服务器应用程序传输到网站前端以用于绑定。我将结果作为XElement发送,该XElement是包含要绑定的数据的XML树的根。如何最好地从方法测试XML的有效性?

我想创建一些测试来检查数据并确保它符合预期。

我现在的想法是这样的:返回XElement树的每个方法都有一个对应的模式(.XSD)文件。该文件包含在包含我的WCF类作为嵌入式资源的程序集中。

测试调用这些方法的方法,并将结果与​​这些嵌入式模式进行比较。

这是个好主意吗?如果没有,我还可以使用其他什么方式来提供“保证”方法将返回哪种XML?

如果是这样,您如何根据模式验证XElement?我如何从嵌入的程序集中获取该模式?

回答

11

我说使用xsd模式验证xml是个好主意。

如何使用加载的模式验证XElement: 正如您在本例中看到的,您需要首先验证XDocument才能填充“模式验证后信息集”(可能有解决方案无需执行此操作使用上的XDocument,但IM的验证方法没有找到一个):

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)); 
+0

element.GetSchemaInfo()返回null。 – Will 2008-09-23 13:37:19

4

如果”回覆 做一些轻量级的工作和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... 
    } 
相关问题