Как лучше всего проверить правильность XML из метода? - PullRequest
5 голосов
/ 22 сентября 2008

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

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

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 23 сентября 2008

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

Как проверить XElement с загруженной схемой: Как вы видите в этом примере, вам нужно сначала проверить XDocument, чтобы заполнить «информационный набор после проверки схемы» (может быть решение сделать это без использования метода Validate в 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;
});

Как прочитать встроенную схему из сборки и добавить ее в 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));
4 голосов
/ 23 сентября 2008

Если вы выполняете небольшую работу и 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...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...