سؤال

يقرأ تطبيق 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 هذه (التي تترجم إلى أكثر من 1.5 مليون أزواج مفتاح مفتاح المفتاح / القيمة). تأتي ملفات XML من العديد من المصادر / الفرق المختلفة ويتم التحقق من صحتها مقابل مخطط. ومع ذلك، في بعض الأحيان <value/> العقد تبدو وكأنها هذه:

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

أو هذا:

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

لجعل هذه العملية بسرعة، نحن نستخدم مغترب لتحليل مستندات 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() وظيفة لقراءة "المفتاح" وتقرر ما يجب القيام به مع القيمة. تم التنميطية، وقد أظهر التطبيق أن ~ 40٪ من إجمالي وقت تحليل XML يتعامل مع هذه الصفات حسب الاسم / السلسلة.

يمكن استلام العملية الشاملة بشكل كبير إذا كان بإمكاني ضمان / فرض ترتيب السمات (للمبتدئين، ولا توجد مقارنات سلسلة في ProcessAttribute()). على سبيل المثال، إذا كانت سمة "المعرف" كانت دائما السمة الأولى التي يمكن أن نتعامل معها مباشرة:

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،

لم تكن ترتيب مواصفات السمة في علامة بداية أو علامة عنصر فارغ ليست كبيرة

يمكنك التحقق من ذلك في القسم 3.1.

نصائح أخرى

سمات XML غير يملك أمر، لذلك لا يوجد أمر لإنفاذه.

إذا كنت ترغب في أمر شيء، فأنت بحاجة إلى عناصر XML. أو شيء مختلف عن XML. JSON، YAML و BENCODE، على سبيل المثال لديك كلا الخرائط (التي غير مرتبة) والتسلسلات (التي أمرت).

كما أشار آخرون، لا، لا يمكنك الاعتماد على طلب السمة.

إذا كان لدي أي عملية على الإطلاق تتضمن 2500 ملف من ملفات XML و 1.5 مليون صفحة رئيسية / قيمة، فسأحصل على هذه البيانات من XML وإلى شكل أكثر قابلية للاستخدام بمجرد إمكانية ذلك. قاعدة بيانات، تنسيق التسلسل الثنائي، أيا كان. أنت لا تحصل على أي ميزة خارج استخدام XML (بخلاف التحقق من صحة المخطط). سأقوم بتحديث متجري في كل مرة تلقيت فيها ملف XML جديد، واتخاذ تحليل عناصر XML 1.5 مليون XML من التدفق الرئيسي لعملية.

الاجابة يكون لا، للأسف. أنا صدمت من رقم 40٪ الخاص بك. أجد صعوبة في الاعتقاد بأن تحول "فو" إلى processfoo يأخذ طويلا. هل أنت متأكد من أن 40٪ لا يشمل الوقت المستغرق إلى نفذ - اعدم processfoo؟

هل من الممكن الوصول إلى السمات حسب الاسم باستخدام هذا الشيء المغتربين؟ هذه هي الطريقة الأكثر تقليدية للوصول إلى السمات. أنا لا أقول أنه سيكون أسرع، لكن قد يكون الأمر يستحق المحاولة.

لا أعتقد أن مخطط XML يدعم أن السمات التي يتم تعريفها للتو

لا أعرف بأي طريقة أخرى للتأكد من أن السمات على عقدة XML تأتي بترتيب معين - لست متأكدا مما إذا كان أي من آليات مخطط XML الأخرى مثل Schematron أو Relax NG سيدعم ذلك ....

أنا متأكد من أنه لا توجد طريقة لفرض ترتيب السمة في مستند XML. سأفترض أنه يمكنك الإصرار عليه عبر عملية تجارية أو عوامل بشرية أخرى، مثل عقد أو وثيقة أخرى.

ماذا لو كنت تفترض فقط أن السمة الأولى كانت "معرف"، واختبار الاسم للتأكد؟ إذا كانت الإجابة بنعم، استخدم القيمة، وإذا لم يكن كذلك، فيمكنك محاولة الحصول على السمة حسب الاسم أو رمي المستند.

في حين أن عدم كفاءة السمات من قبل ترتيبي، فإن بعض الأوقات غير الصفرية ستتمكن من تخمين أن مقدمي البيانات قد قاموا بتسليم XML إلى المواصفات. بقية الوقت، يمكنك اتخاذ إجراءات أخرى.

مجرد تخمين، ولكن يمكنك محاولة إضافة use="required" لكل من مواصفات سمة الخاص بك؟

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

أنا أتساءل عما إذا كان المحلل المحلل يتم إبطاله عن طريق السماح للسمات الاختيارية، عندما يظهر أن سماتك ستكون دائما هناك.

مرة أخرى، مجرد تخمين.

تعديل: XML 1.0 المواصفات تقول أن ترتيب السمة غير مهم. http://www.w3.org/tr/rec-xml/#sec-starttags.

لذلك، لن يقوم XSD بتنفيذ أي طلب. لكن هذا لا يعني أن المحللين لا يمكن أن ينخدعوا في العمل بسرعة، لذلك أنا أحافظ على الإجابة المذكورة أعلاه المنشورة في حال عملها بالفعل.

من ما أتذكره، Expat هو محلل محلل صحيحة وأفضل لذلك .. حتى تتمكن من الخردة هذه فكرة XSD. لا يوجد في أي فكرة جيدة في الطلبات في العديد من أساليب XML (XSD حصلت على انتقاد على عنصر ترتيب ENTET مرة أخرى في اليوم، على سبيل المثال، عن طريق برو أو مضاد للبائعين لخدمات الويب XML على MSFT).

قم بترميزك المخصص وإمكانك ببساطة منطقك بحثا عن بحث أكثر كفاءة أو حفره في مصدر المحلل المحلل إنه تافهة لكتابة الأدوات حول ترميز استبدال فعال أثناء حماية وكلاء البرامج والمستخدمين منه .. تريد القيام بذلك، لذلك يتم ترحيلها بسهولة مع الحفاظ على التوافق والانعكاس المتخلص. أيضا، اذهب للحصول على قيود / اسم السمة المحاسوم بالحجم الثابت.

اعتبر نفسك محظوظا مع المغتربين :) وسرعتها الخام. تخيل كيف أن CLR Devs Love مرافق تحجيم XML، أنها ترسل بشكل روتيني 200 ميغابايت على السلك في عملية "مجرد الاستعلام عن قاعدة البيانات" ..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top