使用Xpath选择XSD架构中的节点



我有下面的代码,我希望用它来选择特定序列中需要的所有元素。以下是片段:

            XmlDocument schema = new XmlDocument();
            schema.Load(SchemaFileName);
            XmlNamespaceManager xnm = new XmlNamespaceManager(schema.NameTable);
            xnm.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
            XmlNodeList list = schema.SelectNodes(Path);

然而,我不确定我应该写什么作为路径。理想情况下,我想选择"sequence"标记的所有子节点,但当我将Path设置为"sequency"时,当我运行它时,它不会给我任何信息。节点列表只是空白的。我要做的是获取验证xml文件所需的元素的名称(按顺序)。

此外,当我将Path设置为"//@name"时,我确实会得到一些东西,它会选择所有以"name"为属性的元素。我想要的是特别在"sequence"标签后面的。

我也尝试过将Path设置为"xs:sequence",但这给了我一个错误:"需要Namespace Manager或XsltContext。这个查询有前缀、变量或用户定义的函数。"这很奇怪,因为我以为我已经设置好了。。

感谢您的帮助!谢谢如果你需要更多的信息,我很乐意提供。

真诚,

tf.rz

编辑:我正在使用Visual Studio C#2008。.NET 3.5 SP1

基本前提与我发布的关于数据表列的重新排序的另一个问题有关。但为了缩短解释。我只需要说,我只需要xsd模式将验证的元素的名称(按正确的顺序)。我有几个xsd模式,所有这些模式都遵循相同的"格式",都是非常非常静态的文件。因此,我知道我可以安全地查找序列标记并获取它的所有子节点。虽然Michael提到了如何有多种方法来编写模式,但我正在使用的模式在这些方面都是相似和静态的,所以如果我能够做到这一点,它将100%有效。=)

您的基本问题是需要了解如何使用XPath访问使用名称空间的源文档。这是非常基本的东西,这个论坛上有一千个答案可以解释它。你需要一个前缀名称xs:sequence,你需要告诉你的XPath引擎"xs"前缀代表URIhttp://www.w3.org/2001/XMLSchema"-这方面的咒语因XPath引擎而异,恐怕我无法识别代码中的类名,所以我不知道是哪一个。

然而,我认为还有一个更深层次的问题。使用XPath表达式从源XSD文档中提取信息有点像尝试使用正则表达式从Java程序中提取信息。它在某些时候会起作用;如果你很聪明,你可以在很多时候让它发挥作用;但它永远不会一直有效,因为编写模式的方法太多了。一个更好的想法是使用真正的模式处理器来处理模式,然后使用其API来询问关于模式内容的问题。

最新更新