2011-12-07 52 views
2

我有一个XSD文件,并希望获取其中所有元素的名称列表。我并不是指像<xs:sequence>等东西,只是“真正的东西”,它实际上可以出现在XML中,根据XSD有效。获取C#中的XSD元素列表

+0

您可以请包括您尝试处理的XSD文件的示例吗? –

+0

确定:http://www.uloz.to/11605646/ships-xsd(如果网站不是英文的,右上角有一些语言切换) – Ondrej

+0

如果所有其他的都失败了,请记住XSD本身就是XML ,所以你可以阅读它并手动提取你需要的信息。 –

回答

1

真正的东西是有点含糊

但是,如果你只是想希望所有的元素,它只是一个的XPath它。

如果你想要一棵树,那么你不能避免序列等。 如果你有像xs:choice这样的东西,那么你有更多的问题。

然后还有属性...

从简单文本类型或复合...

可能会更容易产生从XSD一个“空白”的XML文档,然后得到你想要出什么。尽管如此,这仍然是一大块代码。可能是一个躺在你身边可以借用。

+0

我不需要树,没有xs:xhoice,没有属性 – Ondrej

+0

这是一个简单的xpath查询每个元素节点的名称属性,然后,看不出为什么问题值得付出更多的努力。 –

1

如果您实际上不想从代码执行此操作,则可以使用XML Schema Definition Tool (Xsd.exe)为运行时对象创建源代码。

从那里您可以使用Xml序列化为您给定的Xsd模式创建有效的Xml示例。

0

由于您正在尝试为此编写代码,因此我会假设您要对不同的XML模式文件进行反复处理;如果这是真的,那么理解你是否真的需要将它嵌入到你的代码库中,或者如果它可以用作外部工具,那将是非常重要的。

如果你真的想这样做,最需要的是在System.Xml.Schema包中。从XmlSchemaSet开始加载和编译您的XSD文件。然后使用GlobalElements上的迭代器,遍历全局元素,这些元素可以显示为XML文档中的根元素并遍历这些元素(为了您的需要,使用PSVI属性);就像其他人提到的那样,会有类型可以通过,合成器等等。然后还有更多:抽象元素(那些不能用XML显示,既不是抽象元素的引用,也不是替代组的成员),禁止属性,限制类型等与你的需求有关;您发布的XML Schema可能如下所示:

root/ship/engine/@MaxSpeed,A,1..1,True 
root/ship/crew/@function,A,1..1,True 
root/ship/@Name,A,1..1,True 
root/ship/@class,A,1..1,True 
root/ship/special_abilities/hull/@separable,A,0..1,False 
root/ship/special_abilities/hull/@canCarryWesley,A,0..1,False 
root/ship/special_abilities/hull/@capableOfLanding,A,0..1,False 

如果您愿意,您只能处理第一列;生成的XPath只显示具有数据的项目(元素或属性);处理类似上述可能会更容易(使用/分割字符串,元素除@之外)