[OK]を、ここでは別のアプローチです。あなたが検証したいタイプNestedElement
のスニペットを持って、あなたの元のスキーマが
<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>
だろうと言う:
<NestedElement Name1="Name1" />
次にあなたが作成する
<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>
のようなXSLTテンプレートを使用することができますNestedElement
をルートとする新しいスキーマ得られたスキーマは、あなたが次に
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
ようなコードを使用して、この新しいスキーマに対してスニペット文書を検証でき
<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>
ようになり、元のスキーマ、SchemaTransform.xslt
である(上記のように)変換でありますrootelement.xml
は、単一のスニペットノードを含むXMLドキュメントです。
'XmlDocument'のルートノードを使用できない場合は' SelectSingleNode'を使用することができません.Xmlをロードする必要があります。これは、有効でない場合に失敗します。あなた自身の文書が有効でない限り、 'XPath'を使うことはできないと思います。 そうする方法はありますか? –