Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSD:可以具有简单内容或元素上下文的复杂类型_Xml_Xsd_Complextype - Fatal编程技术网

Xml XSD:可以具有简单内容或元素上下文的复杂类型

Xml XSD:可以具有简单内容或元素上下文的复杂类型,xml,xsd,complextype,Xml,Xsd,Complextype,我正在为一种相当复杂的XML文件格式编写XSD。在许多情况下,XML既可以包含实际的文本值,也可以包含生成该值的脚本。(想想Excel:42与=21+21) 例如,要指定一个大小,必须写入以下任一项: <size>42</size> <size><script>2*21</script></size> 42 2*21 我的第一个想法是使用在size元素中允许int或脚本。但是,我必须给string元素一个名称,这会导致像

我正在为一种相当复杂的XML文件格式编写XSD。在许多情况下,XML既可以包含实际的文本值,也可以包含生成该值的脚本。(想想Excel:
42
=21+21

例如,要指定一个大小,必须写入以下任一项:

<size>42</size>
<size><script>2*21</script></size>
42
2*21
我的第一个想法是使用
size
元素中允许int或脚本。但是,我必须给string元素一个名称,这会导致像
42
这样笨拙的语法。由于文字的使用频率远远高于脚本,我不想夸大它们的语法


你知道如何在XSD中表达初始语法吗?

我认为有两个不错的选择

  • 无论哪种情况,都不要在
    中放置任何子元素。相反,您可以在size元素上设置一个“type”属性,向使用者指示它是文本还是脚本
  • 使用此处描述的两种技术之一(都基于对complexContent使用“mixed=true”属性:

  • 要在这些选项中进行选择,您需要站在消费者应用程序的立场上,决定它最有可能如何获取这些数据。一般来说,我认为如果主要消费者是一名开发人员,将XML解析为一次性集成任务,则选项一是最好的(因为输出和XSD都更简洁,在我看来更可读);如果您看到一个XML工具正在使用您的模式,那么选项二可能会更好,因此如果有具体的元素需要解析,那么做一些特殊的事情可能会更容易。最终,尽管我只是猜测您在XSD 1.0中的用例是什么…

    ,但是如果您不想更改XML实例的设计,您唯一的实际选择是将内容模型声明为混合内容


    在XSD 1.1中,您可以将其声明为混合内容,然后使用断言说明元素必须具有元素子元素或文本节点子元素,但不能同时具有这两个子元素。

    我接受这个答案,因为它显示了最佳选项。但是,在不牺牲控制的情况下,使用混合内容似乎不可能获得我想要的确切语法我最终选择了两个版本的size元素,每个版本都有不同的名称。