首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以使用模式强制XML属性的顺序吗?

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

Stack Overflow用户
提问于 2009-11-06 01:13:17
回答 8查看 24.1K关注 0票数 18

我们的C++应用程序从如下所示的XML文件中读取配置数据:

代码语言:javascript
复制
<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/>节点看起来像这样:

代码语言:javascript
复制
<value name="bar1" id="BAR1" description="the bar" size="20" ... />

或者这样:

代码语言:javascript
复制
<value id="BAT1" description="the bat" name="bat1"  size="25" ... />

为了使这个过程更快,我们使用Expat来解析XML文档。Expat将属性公开为数组,如下所示:

代码语言:javascript
复制
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()函数来读取“键”并决定如何处理这个值。分析应用程序显示,大约40%的总解析时间是通过名称/字符串来处理这些属性。

如果我能保证/强制属性的顺序(对于初学者来说,在ProcessAttribute()中不进行字符串比较),整个过程就会大大加快。例如,如果'id‘属性总是第一个属性,我们可以直接处理它:

代码语言:javascript
复制
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.
}

根据XML规范,我可以在W3C schema中使用<xs:sequence>来强制元素的顺序--但它似乎不适用于属性--或者我可能没有正确地使用它:

代码语言:javascript
复制
<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文档中强制属性顺序?如果答案是“不”--有没有人能提出一个不会带来巨大的运行时性能损失的替代方案呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-11-06 01:28:37

根据xml规范,

开始标记或空元素标记中属性规范的顺序并不重要

你可以在section 3.1上查看

票数 37
EN

Stack Overflow用户

发布于 2009-11-06 03:12:15

XML属性没有顺序,因此没有顺序可执行。

如果你想要一些有序的东西,你需要XML元素。或者是与XML不同的东西。例如,JSON、YAML和bEncode都有映射(无序)和序列(有序)。

票数 6
EN

Stack Overflow用户

发布于 2009-11-06 09:10:50

正如其他人所指出的,不,您不能依赖属性排序。

如果我有任何涉及2500个XML文件和150万个键/值对的进程,我会尽快从XML中获取数据,并将其转换为更有用的形式。数据库、二进制序列化格式等等。您不会从使用XML中获得任何好处(模式验证除外)。每当我得到一个新的XML文件时,我都会更新我的存储,并从我的流程的主要流程中解析150万个XML元素。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1682131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档