Ok, hier ist ein anderer Ansatz:
Sie könnten Ihre Schemadatei mit Hilfe einer XSLT-Transformation in ein neues Schema umwandeln, die Ihre Schnipsel Elemente als Wurzel hat. Sagen Sie Ihre ursprüngliche Schema wäre
<xs:schema id="MySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element name="NestedElement">
<xs:complexType>
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Sie Schnipsel vom Typ haben NestedElement
, die Sie überprüfen möchten:
<NestedElement Name1="Name1" />
Dann Sie eine XSLT-Vorlage verwenden könnte wie
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xs:element[@name='NestedElement']"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:schema id="MySchema">
<xsl:copy-of select="."/>
</xs:schema>
</xsl:template>
</xsl:stylesheet>
a zu erstellen neues Schema, das NestedElement
als root hat. Das resultierende Schema würde aussehen wie
<xs:schema id="MySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="NestedElement">
<xs:complexType>
<xs:attribute name="Name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>
Sie können dann einen Schnipsel Dokument gegen dieses neue Schema validieren einen Code wie
XmlSchema schema;
using (MemoryStream stream = new MemoryStream())
using (FileStream fs = new FileStream("MySchema.xsd", FileMode.Open))
using(XmlReader reader = XmlReader.Create(fs)) {
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("SchemaTransform.xslt");
transform.Transform(reader, null, stream);
stream.Seek(0, SeekOrigin.Begin);
schema = XmlSchema.Read(stream, null);
}
XmlDocument doc = new XmlDocument();
doc.Schemas.Add(schema);
doc.Load("rootelement.xml");
doc.Validate(ValidationHandler);
MySchema.xsd
verwendet, ist das ursprüngliche Schema, SchemaTransform.xslt
die Transformation (wie oben dargestellt) rootelement.xml
ist ein XML-Dokument, das einen einzelnen Snippet-Knoten enthält.
Ich bin nicht sicher, wie Sie 'SelectSingleNode' verwenden könnten, wenn Sie nicht den Wurzelknoten des' XmlDocument' verwenden können, in den Sie Ihr Xml laden müssten, was fehlschlagen würde, wenn es nicht gültig wäre. Es lässt mich denken, dass Sie 'XPath' nicht verwenden können, wenn Ihr Dokument selbst nicht gültig ist. Oder gibt es eine Möglichkeit, dies zu tun? –