Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 给定一个XML文件和相关的XSD,I';我想在那个XML实例中找到元素的XSD_.net_Xml_Xpath_Xsd - Fatal编程技术网

.net 给定一个XML文件和相关的XSD,I';我想在那个XML实例中找到元素的XSD

.net 给定一个XML文件和相关的XSD,I';我想在那个XML实例中找到元素的XSD,.net,xml,xpath,xsd,.net,Xml,Xpath,Xsd,我正在开发一些软件,生成一个用户界面,将数据输入到一个非常复杂的XML文件中。我有一个输入文本文件,描述要向用户呈现的GUI字段,以及XML文件中元素存储的XPath。例如,给定以下XML: <rootDoc> <A> <B someAttr="Hello"/> </A> </rootDoc> 我可能会显示一个带有XPath为“/a/B/@someAttr”的文本框的GUI字段。通过这种方式,我知道从

我正在开发一些软件,生成一个用户界面,将数据输入到一个非常复杂的XML文件中。我有一个输入文本文件,描述要向用户呈现的GUI字段,以及XML文件中元素存储的XPath。例如,给定以下XML:

<rootDoc>
    <A>
        <B someAttr="Hello"/>
   </A>
</rootDoc>

我可能会显示一个带有XPath为“/a/B/@someAttr”的文本框的GUI字段。通过这种方式,我知道从何处读取原始值以显示在文本框中,然后当用户单击“确定”时,我还知道在何处存储原始值。这一切都很好,我已经让它工作了。现在回答问题-

有大量的XSD描述XML文件的结构、需要哪些字段以及字符串字段的数据(例如,最大字段长度等)。因此,对于我上面非常简单的示例,可能会有如下XSD(很抱歉,如果这不是有效的XSD,我只是想让大家了解一下……):


现在,假设我知道GUI字段的XPath是/A/B/@someAttr,那么在.NET中是否有某种方法可以获取与@someAttr关联的XSD元素?例如,我会使用它来验证字段的格式是否正确;我还可以根据需要“标记”GUI字段,等等。请注意,我不是在寻找如何根据XSD验证XML——我希望在显示GUI时进行“处理”,以便我可以立即在GUI上标记所需字段,或者将最大字段长度设置为XSD中指示的字段长度,等等

请注意,我是用C#编写的,因此希望使用.NET特定的指针


Edited:另一种表述方式可能是,“给定一个XSD和一个表示从该XSD描述的XML中选择的元素或属性的xpath,有没有办法获取表示xpath表达式将选择的元素或属性的模式的XSD块?”

这是一个看似简单但并非如此的问题。将模式类型分配给标记的过程称为“类型关联”,它对标记出现的上下文非常敏感。事实证明,除非从文档开始到标记出现的位置执行模式验证,否则无法预测应用于特定标记的模式类型

W3C联盟(XML和XML模式规范的作者)已经指定了XML处理器应该如何公开其类型关联信息。该信息简称为“模式验证后信息集”或PSVI


似乎.Net中支持PSVI:

您可以动态查找它,但它可能会变得混乱,例如类型B的节点C。类型可以嵌套。节点可以有本地限制。节点名称可能不够,例如,对于不同的父级/路径,名为item的元素可能不同。我们要做的是解析xsd并建立一个树,这样您就可以跳过元素/复合类型、序列、元素等。一个简单的xsd,您可能会侥幸逃脱,一个有人精神失常、缓慢和痛苦的xsd,特别是如果您有选择元素的话。\p如果可行,唯一的元素名称将有帮助。e、 g.没有订单/项目和发票/项目
<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>