我有一些WCF方法,用来传递信息的服务器应用程序的网站前端使用的结合。我发送的结果作为一个T这是一个根XML树含有数据我要结合反对。

我想要创建一些测试,检查数据和确保它遇到如预期的那样。

我目前的想法是这样的:每一个方法,该方法返回的一个T树有一个相应的架构(.文件)的文件。该文件包括在大会,其中包含我的WCF类作为一个嵌入的资源。

试验电话的方法在这些方法和比较结果对这些嵌入式的架构。

这是一个很好的主意吗?如果不是,什么其它的方式我可以用来提供"保证"是什么样的XML一方法将会回来吗?

如果是,你怎么验证T反对架构?我怎么能得到那个架构的大会,它是埋在?

有帮助吗?

解决方案

Id说验证xml与划架构是一个好主意。

如何验证T装载的架构:正如你看到的在这个例子中你需要验证XDocument第一个得到填充的"后架构验证信息集"(有可能是一个解决方案做到这一点没有使用验证的方法上的XDOcument但是我还没有找到一个):

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;
});

如何读取嵌入方案从一个组件,并将它添加到验证错误的信息指定事件处理程序:

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数据。例如,我有一些类项目中得出自T.一个是ExceptionXElement,另一个是HttpHeaderXElement,等等。在他们,我继承T和增加分析和TryParse方法,采取串含XML数据,以创建一个实例。如果TryParse()returns false string不符合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...
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top