좋아, 여기에 또 다른 방법입니다.
<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
의 조각이
<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
을 루트로 사용합니다. 결과 스키마 (위 그림 참조) SchemaTransform.xslt
가 변화하고, 원래의 스키마가 그런 다음
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>
과 같을 것이다 , rootelement.xml
은 단일 스 니펫 노드가 포함 된 XML 문서입니다.
Xml을로드해야하는 XmlDocument의 루트 노드를 사용할 수없는 경우'SelectSingleNode'를 어떻게 사용할 수 있을지 모르겠습니다. 유효하지 않은 경우 실패합니다. 문서 자체가 유효하지 않으면'XPath'를 사용할 수 없다고 생각합니다. 그렇게 할 방법이 있습니까? –