1

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

            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);

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

此外,当我将路径设置为“//@name”时,我确实得到了一些东西,它选择了所有具有“name”作为属性的元素。我想要的那些就在“序列”标签之后。

我也尝试将路径设置为“xs:sequence”,但这给了我一个错误:“需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。” 这很奇怪,因为我以为我已经设置好了..

任何帮助表示赞赏!谢谢!如果您需要更多信息,我很乐意提供。

真挚地,

tf.rz

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

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

4

1 回答 1

2

您的基本问题是您需要了解如何使用 XPath 访问使用名称空间的源文档。这是非常基本的东西,这个论坛上有上千个答案可以解释它。您需要一个前缀名称 - xs:sequence - 并且您需要告诉您的 XPath 引擎“xs”前缀代表 URI “http://www.w3.org/2001/XMLSchema” - 对此的咒语从一个变化XPath 引擎到另一个,恐怕我无法识别代码中的类名,所以我不知道它是哪一个。

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

于 2011-06-30T09:12:10.653 回答