我正在开发一些软件,它可以生成一个用户界面,用于将数据输入到一个非常复杂的XML文件中。我有一个输入文本文件,它描述了要向用户显示的GUI字段,以及XML文件中元素存储的XPath。例如,给定以下XML:
<rootDoc>
<A>
<B someAttr="Hello"/>
</A>
</rootDoc>
我可能会显示一个带有XPath为"/a/B/@someAttr"的文本框的GUI字段。通过这种方式,我知道从哪里读取原始值以显示在文本框中,然后当用户单击"确定"时,我也知道将其存储回哪里。这一切都很好,我让它发挥作用。现在是问题-
有大量的XSD描述了XML文件的结构、需要哪些字段以及字符串字段的数据(即,最大字段长度等)
<schema>
<complexType name="B">
<complexContent>
<attribute name="someAttr" use="required"/>
</complexContent>
</complexType>
<complexType name="A">
<sequence>
<element name="B" type="B" minOccurs="0"/>
</sequence>
</complexType>
</schema>
现在,假设我知道GUI字段的XPath是/A/B/@someAttr,那么在.NET中是否有某种方法可以获得与@someAtter关联的XSD元素?例如,我会使用它来验证字段的格式是否正确;我也可以根据需要"标记"GUI字段,等等。注意,我不是在寻找如何根据XSD验证XML——我希望在显示GUI时进行"处理",这样我就可以立即在GUI上标记所需字段,或者将最大字段长度设置为XSD中表示的长度,等等。
请注意,我是用C#编写的,所以我很感激.NET特定的指针。
编辑:另一种说法可能是,"给定一个XSD,以及一个表示从该XSD所描述的XML中选择的元素或属性的xpath,有没有办法获得表示该元素或属性模式的XSD块,该模式将由xpath表达式选择?"
这是一个看起来很简单的问题,但事实并非如此。将架构类型分配给标记的过程称为"类型关联",它对标记出现的上下文很敏感。事实证明,除非您从文档的开始到标记出现的点执行模式验证,否则您无法预测哪种模式类型应用于特定标记。
W3C联盟(XML和XMLSchema规范的作者)已经指定了XML处理器应该如何公开其类型关联信息。该信息被称为"架构后验证信息集"或简称PSVI。
看起来.Net中似乎支持PSVI:https://msdn.microsoft.com/en-us/library/system.xml.schema.extensions%28v=vs.110%29.aspx