2008-09-22 2 views
5

У меня есть некоторые методы WCF, которые используются для передачи информации из серверного приложения в интерфейс сайта для использования в привязке. Я отправляю результат как XElement, который является корнем дерева XML, содержащего данные, с которыми я хочу связываться.Как лучше всего проверить правильность XML-метода?

Я хотел бы создать несколько тестов, которые исследуют данные и гарантируют, что они натолкнутся, как и ожидалось.

Мое настоящее мышление таково: каждый метод, возвращающий дерево XElement, имеет соответствующий файл схемы (.XSD). Этот файл включен в сборку, которая содержит мои классы WCF в качестве встроенного ресурса.

Тесты вызывают метод для этих методов и сравнивают результат с этими встроенными схемами.

Это хорошая идея? Если нет, то какие другие способы я могу использовать для предоставления «гарантии» того, какой метод XML будет возвращен?

Если это так, как вы проверяете XElement на схему? И как я могу получить эту схему из сборки, в которую она встроена?

ответ

11

Id говорят, что проверка xml с помощью схемы xsd - хорошая идея.

Как проверить 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() возвращает нуль. – 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... 
    } 
Смежные вопросы