【问题标题】:Default XML schema / XSD when none is specified?未指定时的默认 XML 架构/XSD?
【发布时间】:2020-04-06 09:50:24
【问题描述】:

我从数据分析师的角度总结了有关数据 I/O 的经验教训,而没有受益于数据工程专业知识(并且非常明确地指出了该缺点)。为了给各种备选方案提供上下文,考虑到我店内的限制,我对 XML 导入/导出进行了简单的试验,并完成了有关模式的在线阅读。关于第四代语言环境的开源实用程序,我注意到的一件事是它似乎使用默认值(我没有指定):

<?xml version="1.0" encoding="utf-8"?>
<y>
   <DataFrame1>
      <DataFrame1_Field1>[75;75;75;75;75;75;75;75;75;...;75;75]</DataFrame1_Field1>
      <DataFrame1_Field2>[2014;2014;2015;2015;2016;2016;...;2083;2084;2084;2085;2085;2086;2086]</DataFrame1_Field2>
      <DataFrame1_Field3>
         <item>ABC</item>
         <item>DEF</item>
      <...snip...>
         <item>00-00</item>
         <item>00-00</item>
         <item>00-00</item>
      </DataFrameP_FieldM>
      <DataFrameP_FieldN>[2;2;4;2;5;3;5;3;3;1;5;5;...;4;5;3;3;2;4;2;1;2;4]</DataFrameP_FieldN>
   </DataFrameQ>
   <DataFrameR>
      <DataFrameR_Field1>[75;75;75;75;75;75;...;75;75;75;75;75]</DataFrameR_Field1>
      <DataFrameR_Field2>[1;2;3;4;5;6;7;...;1638;1639;1640;1641;1642]</DataFrameR_Field2>
      <DataFrameR_Field3>[0;0;0;0;0;0.014925;0.223881;0.014925;...;0;0.059701;0;0;0;0;0;0;0.626866]</DataFrameR_Field3>
   </DataFrameR>
   <DataFrameS>
      <DataFrameS_Field1>[75;75;75;75;75;75;...;75;75;75;75;75;75;75]</DataFrameS_Field1>
      <DataFrameS_Field2>[1;1;1;1;1;1;1;...;1642;1642;1642;1642;1642]</DataFrameS_Field2>
      <DataFrameS_Field3>[0;0;0;0;0;0;0;0;...;7;0.7;0.7;0.8;0.8;0.8;0.9;0.9;1]</DataFrameS_Field3>
      <DataFrameS_Field4>[0;0.1;0.2;...;0;0.1;0.2;0;0.1;0]</DataFrameS_Field4>
      <DataFrameS_Field5>[1;0.9;0.8;...;0.3;0.2;0.1;0;0.2;0.1;0;0.1;0;0]</DataFrameS_Field5>
      <DataFrameS_Field6>[0;0;0;0;0;0;...1;1;1;1;1;1;1;1;1;1]</DataFrameS_Field6>
   </DataFrameS>
</y>

解释标签:所有以字符串“DataFrame...”开头的标签都是我在代码中进行的匿名化处理。在匿名化之前,DataFrameX(其中 X 是任何字母数字字符)是我的 4GL 环境 [1] 中数据框对象的名称。所有包含字符串“DataFrame”和“Field”的标签也是匿名的。在匿名化之前,它们是数据框中的字段名称。标签&lt;y&gt;就是4GL环境下数据帧集合的对象名。

数据的排列对我来说都很有意义,因为我知道我对数据来自的数据帧做了什么。所有的标签都是有意义的。我假设它们来自通用默认模式。但是,我的网络搜索没有发现任何迹象表明存在这种默认模式,更不用说达成一致/标准化了。是否有这样的通用默认值,或者这些标签是导出实用程序作者的结果?

[1] 4GL 环境是 Matlab,但我的问题是关于 XML 实践和约定而不是 Matlab。

【问题讨论】:

    标签: xml xsd schema xsd-validation xml-validation


    【解决方案1】:

    任意 XML 文件没有默认 XML 架构。 W3C XML Recommendation 给出了格式良好的规则,但这些规则定义了 XML 本身,而不是任何给定 XML 模式的词汇和语法。

    在未指定 XSD 时识别 XSD

    1. 在 XML 中指定 schemaLocation 时,请参阅此处指定的 XSD。为了 有关schemaLocation 的更多信息,请参阅 How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?
    2. 仅使用命名空间时,请参阅 How to locate an XML Schema (XSD) by namespace?
    3. 当 XML 的提供者可用时,询问或检查源/文档。
    4. 当使用相对唯一/信息丰富的元素名称时,或者如果您知道 部门/行业谷歌元素名称部门/行业和“xml架构”。

    如果上述方法都不起作用,请使用无模式,或者自己编写以适应数据。


    有关 XML 设计的更多信息

    在 cmets 中,@user2153235 询问:

    是否存在一种普遍的做法(或者甚至是在没有显式模式的情况下默认采用的通用的、最小的“基本”方案),其中原子元素是“项目”,而任何其他标记表示的元素是是字符串还是由下级元素组成的结构?

    是的,有一种流行的做法。

    对问题的回答:不,没有通用的、最小的“基本”模式——只有 XML 本身的格式良好的规则。

    您帖子中的 XML 设计不佳:

    • 命名很糟糕:
      • 根元素名为y,但其内容显然不是简单的y坐标或任何其他可以合理描述为y的东西。
      • 基于DataFrame 的名称具有C 字符后缀,后跟_FieldN 数字后缀。除非C 字符在某些域中有意义,否则应该扩展缩写。列表成员上的硬连线数字后缀最好由位置隐含,以便名称可以在词法上表示类型,而不必分解。
    • 未标记子结构:通常,结构不应隐藏在字符串中的微格式中;应该施加标记,以便可以利用 XML 解析器,而不必在应用程序中实现微解析器。

    【讨论】:

    • 谢谢,kjhughes。该实用程序位于Matlab file exchangexml_write 函数的代码为here
    • 但是当我没有架构时,我并没有真正尝试对函数进行逆向工程,也没有找到解决方案。我只是想知道在没有模式时是否有关于用于嵌套对象的标签的约定(事实上的或显式的)。我可以从您的回答中得出结论,它是“不”吗?如果是这样,我想知道您是否可以将其添加到您的答案中。谢谢。
    • 嗯,您能否详细说明在没有架构时用于嵌套对象的标签的约定(事实上或显式)是什么意思?你在谈论命名约定吗?何时使用元素与属性?还有什么?
    • 我对模式的理解来自this tutorial 和后面的构成课程。它类似于强类型语言中分层“struct[ure]”的定义,即预定义的组成数据元素的集合(有序或无序)。当您实际提供与架构对应的数据时,它必须遵循结构和元素名称/类型。实际数据中的标签(尖括号中的标签)必须与架构中元素的名称匹配。
    • 我已更新答案以解决您 cmets 中的后续问题。
    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2014-07-21
    • 2014-01-07
    • 2014-07-15
    相关资源
    最近更新 更多