Frage

Ich habe einige WCF Methoden, die verwendet werden für die Verwendung von Informationen von einer Server-Anwendung auf einem Website-Frontend zu übertragen in der Bindung. Ich bin das Ergebnis als XElement sendet, die eine Wurzel eines XML-Struktur ist es, die Daten enthalten, ich gegen binden möchten.

Ich mag einige Tests erstellen, die die Daten zu prüfen und sicherzustellen, dass es rüberkommt wie erwartet.

Meine derzeitigen Überlegungen ist dies: Jede Methode, die ein entsprechendes Schema (.XSD) Datei ein XElement Baum hat zurückgibt. Diese Datei wird in der Baugruppe enthält, die meine WCF-Klassen als eingebettete Ressource enthält.

Tests rufen Sie die Methode zu diesen Methoden und vergleichen das Ergebnis mit diesem eingebetteten Schema.

Ist das eine gute Idee? Wenn nicht, was andere Weise kann ich eine „Garantie“ von schaffen, welcher Art von XML ein Verfahren zurückkehren?

Wenn ja, wie kann man eine XElement gegen ein Schema validieren? Und wie kann ich das Schema aus der Versammlung es eingebettet in bekommen?

War es hilfreich?

Lösung

Id sagen Validieren von XML mit einem XSD-Schema ist eine gute Idee.

Wie ein XElement mit dem geladenen Schema zu überprüfen: Wie Sie in diesem Beispiel sehen, müssen Sie zuerst die XDocument validieren zu bekommen füllen das „Post-Schema-Validierungs-Information-Set“ (Es könnte eine Lösung sein, dies zu tun, ohne die Validate-Methode auf dem XDocument mit aber ich bin noch zu finden):

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

Wie das eingebettete Schema aus einer Baugruppe zu lesen und zu XmlSchemaSet hinzufügen:

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

Andere Tipps

Wenn Sie etwas leichte Arbeit sind und XSDs sind übertrieben, sollten auch möglicherweise stark Eingabe Ihrer XML-Daten. Zum Beispiel habe ich eine Reihe von Klassen in einem Projekt, das von XElement abzuleiten. Eine davon ist ExceptionXElement, ein anderer ist HttpHeaderXElement etc. In ihnen erben ich von XElement und fügen Parse und TryParse Methoden, die Strings mit XML-Daten nehmen von einer Instanz zu erstellen. Wenn TryParse () false zurückgibt, wird die Zeichenfolge nicht in die XML-Daten entspricht Ich erwarte, dass (das Root-Element hat den falschen Namen, Kinder-Elemente fehlen, usw.).

Zum Beispiel:

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...
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top