我写了一个xml。我想为它生成一个dtd和xsd。是否有一个工具,我可以使用相同而不是输入一切所以我可以避免错误?期待一些投入/线索。
答案 0 :(得分:3)
可以轻松生成可以验证文档的DTD:
<!ELEMENT e (#PCDATA | e)* >
或者对于XSD,只包含
的架构文档<xsd:element name="e"/>
如果这不令人满意,也许您忘了说您希望DTD接受您的XML文档是有效的。在这种情况下,我在XSLT或XQuery中实现类似下面的伪代码
for each $gi in distinct-values($input/descendant-or-self::*/name())
return '<!ELEMENT ' || $gi || ' ANY >
'
对于XSD,将return语句更改为
return '<xsd:element name="{$gi}"/>'
如果这些不满意,也许你忘了说文档语法应该遵守的其他限制。
我们可以生成一个语法来捕获输入中的父/子关系(即,当且仅当某些E元素作为F元素的子元素出现在输入中时,它才允许任何元素E成为元素F的子元素)使用类似
的代码for each $gi in distinct-values($input/descendant-or-self::*/name())
let $occurrences := $input/descendant-or-self::*[name() = $gi]
$children := distinct-values($occurrences/*/name(),
$mixed := some $t in $occurrences/child::text()
satisfies normalize-space($t),
$contentmodel0 := string-join(
(if ($mixed) then '#PCDATA' else (), $children),
' | '
)
return '<!ELEMENT ' || $gi || ' '
|| '('
|| $contentmodel0
|| ')* >
'
我将等效的XSD配方留给读者练习。
如果语法捕获输入中的父/子关系是不够的,但您还希望允许语法中任何元素的子序列匹配&#39; (在某种意义上)输入中的例子,那么你已经达到了一个有趣的问题(不久前值得一篇硕士论文或论文):对于输入中元素E的每个实例,你有一些有限的数字儿童序列:您的任务是定义包含这些序列的常规语言,并清楚地捕获输入的隐式模式。显而易见,很大程度上取决于您对&#39;喜欢&#39;的定义。而且“清楚地”#。
如果你的要求是语法中允许一系列子句,当且仅当它在输入中被实例化时,元素E的内容模型的表述很简单,对于DTD和XSD来说很复杂通过确定性规则(在XSD中称为&#39;独特的粒子归因规则&#39;,这只是一种稍微不那么清晰且更具说服力的说法确定性规则&#39;)。对于任何给定的序列集,可能存在多于一种可能的公式作为内容模型;选择最简单的将需要一些内容模型的复杂程度和一些找到最简单的可用公式的方法。
如果您使用示例HTML文档执行此实验,您可能会发现ul
最终会得到像(li, li, li, li, (li, li, li, li, li)?)
这样的内容模型,因为输入有两个列表,一个包含四个项目,另一个包含九个。如果您希望自己的程序生成更简单的程序,请执行以下操作:或者“更好”&#39;列表的内容模型,如(li+)
或(li*)
,那么您希望您的语法不仅允许在输入中找到的有限数量的序列子项,而且还允许其他序列&#34;喜欢&#34;他们。也就是说,您必须找到一种合适的方法来从输入中进行推广。有无数种方法可以这样做(即使法律概括的类别被限制得像现在任何人都知道的那样严格,但仍有非常大的数字),并选择感觉良好的方法。右&#39;对大多数软件而言,人类可能很难。
总之:有无数的文档语法将您的XML输入视为有效。如果它们对您的目的并非同样有用,那么您需要更严格地约束您的问题,以便它有一个有用的答案。
this earlier Stack Overflow question中提供了更多信息,如果您在发布问题之前在网站上搜索了答案,则应该找到这些信息。
答案 1 :(得分:1)
您可以将此在线工具用于小型xml文件 http://xmlgrid.net/xml2xsd.html