我可以使用模式强制执行XML属性的顺序吗?

前端之家收集整理的这篇文章主要介绍了我可以使用模式强制执行XML属性的顺序吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们的C应用程序从XML文件读取配置数据,看起来像这样:
<data>
 <value id="FOO1" name="foo1" size="10" description="the foo" ... />
 <value id="FOO2" name="foo2" size="10" description="the other foo" ... />
 ...
 <value id="FOO300" name="foo300" size="10" description="the last foo" ... />
</data>

完整的应用程序配置包括约2500个这些XML文件(其转换为超过150万个键/值属性对)。 XML文件来自许多不同的来源/团队,并针对模式进行验证。然而,有时< value />节点看起来像这样:

<value name="bar1" id="BAR1" description="the bar" size="20" ... />

或这个:

<value id="BAT1" description="the bat" name="bat1"  size="25" ... />

为了使此过程快速,我们使用Expat来解析XML文档。 Expat将属性显示为数组,如下所示:

void ExpatParser::StartElement(const XML_Char* name,const XML_Char** atts)
{
 // The attributes are stored in an array of XML_Char* where:
 //  the nth element is the 'key'
 //  the n+1 element is the value
 //  the final element is NULL
 for (int i = 0; atts[i]; i += 2) 
 {
  std::string key = atts[i];
  std::string value = atts[i + 1];
  ProcessAttribute (key,value);
 }
}

这将所有的责任放在我们的ProcessAttribute()函数上以读取“key”,并决定如何处理该值。对应用程序进行分析显示,大约40%的XML解析时间通过名称/字符串来处理这些属性

如果我可以保证/强制属性的顺序(对于初学者,在ProcessAttribute()中没有字符串比较),整个过程可能会大大加快。例如,如果’id’属性始终是第一个属性,我们可以直接处理它:

void ExpatParser::StartElement(const XML_Char* name,const XML_Char** atts)
{
 // The attributes are stored in an array of XML_Char* where:
 //  the nth element is the 'key'
 //  the n+1 element is the value
 //  the final element is NULL
 ProcessID (atts[1]);
 ProcessName (atts[3]);
 //etc.
}

根据W3C模式规范,我可以使用< xs:sequence>在一个XML模式中强制执行元素的顺序 – 但它似乎不适用于属性 – 或者我正在使用它不正确:

<xs:element name="data">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="value" type="value_type" minOccurs="1" maxOccurs="unbounded" />
  </xs:sequence>
 </xs:complexType>
</xs:element>

<xs:complexType name="value_type">
 <!-- This doesn't work -->
 <xs:sequence>
  <xs:attribute name="id" type="xs:string" />
  <xs:attribute name="name" type="xs:string" />
  <xs:attribute name="description" type="xs:string" />
 </xs:sequence>
</xs:complexType>

有没有办法在XML文档中强制实施属性顺序?如果答案是“否” – 任何人可能会建议一个不会承受巨大的运行时性能损失的替代方案?

根据xml规范,

the order of attribute specifications in a start-tag or empty-element tag is not significant

您可以在section 3.1查看

猜你在找的XML相关文章