我想要一些基于 XSD 或 DTD 的动态控件生成显示在表单 (WinForms) 上,并且用户可以填写值,可能主要是将填写属性数据并创建合法的 XML 片段的文本框插入到现有的 XML 文件中。
这可行吗 - 以前有人做过这种事吗 - 如果是的话,你使用了哪种设计?
下面是一个 XSD 的例子:
<xs:element name="layer-config">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="dynamic-feature-layer"/>
<xs:element ref="dynamic-image-layer"/>
<xs:element ref="folder"/>
<xs:element ref="layer"/>
<xs:element ref="wms-layer"/>
</xs:choice>
<xs:attribute name="upload-can-drill-identify" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-extract-excel" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-extract-gml" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-extract-kml" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-find-by-attribute" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-hide-labels" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-identify" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-select" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-select-by-attribute" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-symbolize" type="BOOLEAN_TYPE" use="optional" default="true"/>
<xs:attribute name="upload-can-symbolize-by-attribute" type="BOOLEAN_TYPE" use="optional" default="true"/>
</xs:complexType>
</xs:element>
我正在考虑这样做,因为我不想硬编码到一个已经存在的 XML 文件,以防它被删除或更改为其他东西 - 然后你必须重新编码并重新编译整个文件并重新开始。对于最终用户而言,它也不是那么可维护。
最佳答案
是的,这是可行的。这里有一些提示:
- 您可以使用 LinqToXML 读取具有重要属性(类型、用途等)的定义文件 (XSD)
- 有了您的定义,您应该实现一个负责创建字段的类
- 此类必须有一个方法,该方法使用重要属性根据一个定义创建一个字段
- 此类必须能够根据定义中的元素分组对字段进行适当分组
- 您必须决定使用何种定位方法。定义文件中没有定位信息,你没有报告这是WinForms、WebForms、Silverlight等。
关于c# - 基于 XSD 创建表单生成 XML 的智能方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386830/