我們的C++應用程序讀取XML文件看起來像這樣的配置數據:這些XML文件的我可以使用模式強制執行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(換算成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文檔。外籍公開的屬性數組 - 像這樣:
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%的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文檔中的屬性順序?如果答案是「否」 - 任何人都可能提出一個不會帶來巨大運行時性能損失的替代方案嗎?
你爲什麼去與屬性,而不是 FOO1 foo1 這是描述說明> ?你可以指定元素的順序,爲什麼不使用它們? –
jmucchiello
2009-11-06 01:15:38
+1這是一個寫得很好(有趣)的問題。 – 2012-09-14 18:26:03