从简单的XSD文件生成HTML表单-javascript?
我有一个简单的XSD文件,如下所示:从简单的XSD文件生成HTML表单-javascript?,javascript,html,forms,xsd,Javascript,Html,Forms,Xsd,我有一个简单的XSD文件,如下所示: <?xml version="1.0" standalone="yes"?> <xs:schema id="Employee" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="Employee" msdata:IsDataSet
<?xml version="1.0" standalone="yes"?>
<xs:schema id="Employee" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Employee" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Employees">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="Birth Date" type="xs:dateTime" minOccurs="0" />
<xs:element name="Nationality" type="xs:string" minOccurs="0" />
<xs:element name="Profession" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
我想根据这个XSD信息生成一个HTML表单
有什么建议吗?我正在考虑使用Javascript读取XSD文件并从中生成表单。有可能吗?免责声明:我是一个开源库的作者,该库适合使用Javascript阅读此任务的XSD文件 Jsonix可以根据特定的XML模式解析XML。由于XML模式有一个语法,所以可以使用Jsonix解析XSD。然后需要基于解析的JSON构建HTML表单(这是Jsonix不提供进一步帮助的地方) 这是一个例子 考虑:
您可以使用Jsonix解析这个XSD文件并迭代元素。下面是一段代码片段:
var context=newjsonix.context([XSD_1_0]);
var unmarshaller=context.createUnmarshaller();
unmarshaller.unmarshaller文件(“tests/XSD/1.0/Schema-01.xml”,函数(结果){
var schema=result.value;
var tns=schema.targetNamespace;
var complexTypes=schema.complexType;
var-featureTypes={};
对于(var index=0;index
此特定测试使用Node.js运行,但Jsonix本身也在浏览器中运行
注:
- 是XSD解决方案中现有的UI之一
- 考虑JSON模式而不是XML模式,这将省去XSD解析
- XML模式可能非常复杂,您可以合理地只支持其中的一部分
- 如果事先知道XSD,可以考虑编译时工具来处理模式。在浏览器中处理XSD可能相当繁重,并且只有在高级中不知道您的XSD时才有意义,例如在运行时的deliveren(例如,从某些web服务)
- 是另一个从原理图定义(不是XML原理图,而是基于XML)动态构建Web UI的工具示例。它实际上在下面使用了Jsonix
- 我知道这是一个老问题,但我自己也遇到了这个问题,找不到令人满意的开源解决方案。我最终编写了自己的实现。它自动从XSD生成HTML5表单。它支持大多数XSD标准,包括元素、属性、minOccurs和maxOccurs
如果您更喜欢开箱即用的解决方案,而不是编写自己的解决方案,请参阅我的实现。当然这是可能的,但坦白说,不值得自动化,除非您考虑的是更大或更多的XSD。即使如此,XSLT转换也可能比JavaScript更容易。另请参见:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:gml="http://www.opengis.net/gml" xmlns:nasa="http://nasa.gov" xmlns:ne="http://naturalearthdata.com" xmlns:nurc="http://www.nurc.nato.int" xmlns:og="http://opengeo.org" xmlns:osm="http://openstreemap.org" xmlns:topp="http://www.openplans.org/topp" xmlns:usgs="http://www.usgs.gov/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.openplans.org/topp">
<xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://demo.opengeo.org:80/geoserver/schemas/gml/3.1.1/base/gml.xsd"/>
<xsd:complexType name="tasmania_state_boundariesType">
<xsd:complexContent>
<xsd:extension base="gml:AbstractFeatureType">
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
<xsd:element maxOccurs="1" minOccurs="0" name="STATE" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="COUNTRY" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="CURR_TYPE" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="CURR_CODE" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="tasmania_state_boundaries" substitutionGroup="gml:_Feature" type="topp:tasmania_state_boundariesType"/>
</xsd:schema>
var context = new Jsonix.Context([XSD_1_0]);
var unmarshaller = context.createUnmarshaller();
unmarshaller.unmarshalFile("tests/XSD/1.0/Schema-01.xml", function(result) {
var schema = result.value;
var tns = schema.targetNamespace;
var complexTypes = schema.complexType;
var featureTypes = {};
for (var index = 0; index < complexTypes.length; index++)
{
var featureType = {};
var complexType = complexTypes[index];
var name = complexType.name;
var qname = new Jsonix.XML.QName(tns, name);
featureType.typeName = qname;
featureTypes[qname.key] = featureType;
var elements = [];
if (complexType.complexContent && complexType.complexContent.extension && complexType.complexContent.extension.sequence && complexType.complexContent.extension.sequence.element)
{
elements = elements.concat(complexType.complexContent.extension.sequence.element);
}
if (complexType.sequence && complexType.sequence.element)
{
elements = elements.concat(complexType.sequence.element);
}
featureType.properties = {};
for (var jndex = 0; jndex < elements.length; jndex++)
{
var element = elements[jndex];
var property = {
name: new Jsonix.XML.QName(tns, element.name),
type: element.type,
collection: (element.maxOccurs === 'unbounded')
};
featureType.properties[element.name] = property;
}
}
var featureElements = {};
for (var kndex = 0; kndex < schema.element.length; kndex++)
{
var topLevelElement = schema.element[kndex];
featureElements[topLevelElement.name] = featureTypes[topLevelElement.type.key];
}
console.log(featureElements);
test.done();
});