của chúng tôi ứng dụng C++ đọc dữ liệu cấu hình từ file XML giống như thế này:Tôi có thể thực thi thứ tự các thuộc tính XML bằng cách sử dụng lược đồ không?
<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>
Cấu hình ứng dụng hoàn chỉnh bao gồm ~ 2500 của những tập tin XML (mà dịch thành hơn 1,5 triệu chìa khóa/giá trị thuộc tính cặp) . Các tệp XML đến từ nhiều nguồn/nhóm khác nhau và được xác thực đối với một lược đồ. Tuy nhiên, đôi khi <value/>
nút trông như thế này:
<value name="bar1" id="BAR1" description="the bar" size="20" ... />
hay này:
<value id="BAT1" description="the bat" name="bat1" size="25" ... />
Để thực hiện quá trình này nhanh chóng, chúng tôi đang sử dụng Expat để phân tích các tài liệu XML. Expat cho thấy nhiều thuộc tính như một mảng - như thế này:
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);
}
}
này đặt tất cả trách nhiệm lên chức năng ProcessAttribute()
của chúng tôi để đọc các 'chìa khóa' và quyết định phải làm gì với các giá trị. Việc lập hồ sơ ứng dụng đã chỉ ra rằng ~ 40% tổng thời gian phân tích cú pháp XML đang xử lý các thuộc tính này theo tên/chuỗi.
Quy trình tổng thể có thể tăng tốc đột ngột nếu tôi có thể đảm bảo/thực thi thứ tự các thuộc tính (đối với người mới bắt đầu, không so sánh chuỗi trong ProcessAttribute()
). Ví dụ, nếu thuộc tính 'id' là luôn thuộc tính 1 chúng ta có thể đối phó với nó trực tiếp:
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.
}
Theo thông số kỹ thuật schema W3C, tôi có thể sử dụng <xs:sequence>
trong một lược đồ XML để thực thi sắc lệnh của các yếu tố - nhưng nó dường như không hoạt động cho các thuộc tính - hoặc có lẽ tôi đang sử dụng nó không chính xác:
<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>
Có cách nào để thực thi thứ tự thuộc tính trong tài liệu XML không? Nếu câu trả lời là "không" - có thể ai đó có thể đề xuất một giải pháp thay thế không mang hình phạt hiệu suất thời gian chạy lớn?
Tại sao bạn đi với các thuộc tính và không foo1 foo1 Đây là mô tả description> ? Bạn có thể chỉ định thứ tự của các phần tử, vậy tại sao không sử dụng chúng? –
jmucchiello
+1 Đây là một câu hỏi rất hay (và thú vị). –