我想知道解决此问题的最佳方法: 我想从xml架构创建一个空白模板xml。将创建所有必需的元素和属性,它们的值将是所有空字符串。
下一步是如何确定某个节点可以拥有哪些子xml节点。例如。我会为其中一个子节点选择一个节点有minOccurs =“0”,maxOccurs =“unbounded”。我将能够确定关于该子项,其属性,名称,值类型等的所有内容。
为了提供更多关于这种情况的背景信息,我正在开发一种工具,允许用户在更加用户友好的环境中编辑xml文件。例如,他们可以向“帐户数据库”节点添加新帐户,他们会看到唯一可用的节点是帐户节点。接下来,当他们尝试将子项添加到帐户节点时,选项将是名称节点(必需),密码节点(必需),设置节点(可选)等。如何以编程方式确定帐户节点可用于哪些子节点它以及这些孩子的属性和设置是什么?
这是在带有.NET 2.0的C#2.0中。
总之,我使用哪些类来读取模式并解析它以获取创建xml的有用信息?在我天真的时候,我希望因为xsd本身就是xml,所以我可以遍历某种DOM模型。
我希望将此限制在我的程序中,因此不使用外部工具,如OxygenXml,VS,xsd.exe等。
答案 0 :(得分:1)
我一直在用MSDN文档流下眼睛,我想我已经闻到了一股气味。 使用XmlSchema.Read加载模式并进行编译。 Elements属性将包含“顶级”元素的集合。您必须对根元素的限定名称进行硬编码。那就是它。我还没有找到如何在给定的模式元素下找到“内容”。
编辑:我已经找到了更多的路径,但它仍然不是很清楚。 XmlSchemaElements具有模式类型属性。这要么简单,要么复杂。 xml模式中的复杂类型可以具有属性,序列,组等。序列具有称为粒子的属性,该属性可以是元素。循环重复。但我认为实现的难点在于确保涵盖所有可能的情况(简单类型,带属性的复杂类型,带属性和元素的复杂类型,扩展,整个shebang)。
编辑:使用XmlSchema对象的Element属性获取XmlSchemaElement。使用XmlSchemaElement的SchemaType属性来获取简单或复杂类型。使用XmlSchemaComplexType的Attribute属性获取属性或使用ContentModel获取“简单内容”/“复杂内容”或使用粒子获取'sequence'/'choice'/'all'。基本上有许多向下移动属性和检查类型和左右对象并检查xsd对象的所有可能的排列。创建库将是漫长而繁琐且容易出错的。这是与xml架构,与dtds我甚至不想开始思考。哇,xml架构是必要的,但为什么它们必须如此邪恶。
答案 1 :(得分:1)
听起来你想要做的就是在大多数优秀的XML编辑器中复制XML intellisense背后的功能。即读取xml架构并确定下一步可以使用哪些元素和属性。
我们在一段时间以前的项目上做了类似的事情。制作一些大部分时间都能起作用的东西是很多工作,产生一直有效的东西是大量的工作!
基本上你需要加载XSD(.net中的XmlSchema对象允许你这样做)。但是他们公开的SOM对象模型非常原始,所以你需要做很多工作来解释它。如果忽略替换组,complexType扩展,变色龙模式和名称空间等概念,您应该能够轻松地导航SOM。
接下来,您需要确定XML文档中与模式相关的位置。一旦你知道你在SOM,你就可以开始计算可用的选项。
要做到这一点,需要1000行代码和4-12个星期的工作。你可以在几周内得到一些基本的东西吗?
答案 2 :(得分:0)