Gav*_*vin 7 .net xml xpath xsd
您可以针对XML文档验证XPath表达式以验证它,但是有一种简单的方法可以针对该文档的模式验证相同的XPath表达式吗?
假设我有一个像这样的XSD架构:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... etc>
<xsd:element name="RootData">
<xsd:complexType>
<xsd:sequence minOccurs="0">
<xsd:element name="FirstChild">
<xsd:complexType>
<xsd:sequence minOccurs="0">
<xsd:element name="FirstGrandChild">
... etc etc
Run Code Online (Sandbox Code Playgroud)
是否有一种简单或内置的方法来验证XPath:
/RootData/FirstChild/FirstGrandChild
Run Code Online (Sandbox Code Playgroud)
对任何可能基于该模式的XML文档有效吗?(编辑:我想我的意思是可能有效 ; 实际的 XML文档可能不包含这些元素,但XPath仍然可能被认为对模式有效.但是,/RootData/ClearlyInvalidChild/ThisElementDoesntExistEither
显然无效.)
当然,我只能期望这对规范的XPath表达式而不是任意复杂性的表达式起作用,但这很好.
我特别想在.NET中,但我很好奇其他实现是否可行.我想要自己动手并不是那么重要,例如我真的不想编写自己的代码来将XPath表达式转换为另一个,如:
/xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc...
Run Code Online (Sandbox Code Playgroud)
......虽然我知道如果我真的不得不这样做的话.
干杯!
我们实际上做了一个研究项目,并在2000年左右实现了一个XPath验证程序.这是针对XPath 1.我不知道你可以使用任何当前可用的库来执行此操作.
如果你想自己去实现这个,这里有一些提示:
您将无法像上面那样将实例文档上的路径转换为模式上的路径.例如,/a//b
不转换为/xsd:element[@name='a']//xsd:element[@name='b']
因为元素b可以在模式的顶层定义,而不是在b下面定义.
请记住,虽然XML文档是树,但架构是图形.如果您搜索像// a这样的后代路径,则必须决定何时终止搜索,或者它可以永久地继续(例如,想象在包含"b"的元素"a"中,其中包含"a")
有些路径是不可判定的,或者至少很难决定.例如//*[starts-with(@name, 'foo')]
如果你仍然愿意,我建议使用像eclipse的XSD或.NET模式加载类这样的库来将模式加载到内存中并进行代码检查.
归档时间: |
|
查看次数: |
4586 次 |
最近记录: |