سؤال

أحاول حاليًا قراءة ملف XML وإجراء بعض التغييرات الطفيفة (تغيير قيمة بعض السمات) وكتابته مرة أخرى.

لقد أنوي استخدام محلل StAX (javax.xml.stream.XMLStreamReader) لقراءتها في كل حدث، ومعرفة ما إذا كنت أرغب في تغييره، ثم قم بتمريره مباشرة إلى كاتب StAX (javax.xml.stream.XMLStreamReader) إذا لم تكن هناك حاجة لإجراء تغييرات.

لسوء الحظ، لا يبدو الأمر بهذه البساطة - ليس لدى الكاتب طريقة لأخذ نوع حدث وكائن محلل، فقط أساليب مثل writeAttribute و writeStartElement.من الواضح أنه يمكنني كتابة بيان تبديل كبير مع حالة لكل نوع محتمل من العناصر التي يمكن أن تحدث في مستند XML، ثم كتابتها مرة أخرى مرة أخرى، ولكن يبدو أن هناك الكثير من المتاعب لشيء يبدو أنه يجب أن يكون بسيطًا .

هل هناك شيء أفتقده يجعل من السهل كتابة مستند XML مشابه جدًا للمستند الذي قرأته باستخدام StAX؟

هل كانت مفيدة؟

المحلول

يعمل StAX بشكل جيد وسريع جدًا.لقد استخدمته في مشروع لتحليل ملفات XML التي يصل حجمها إلى 20 ميجابايت.ليس لدي تحليل شامل، لكنه كان بالتأكيد أسرع من SAX.

أما بالنسبة لسؤالك:الفرق بين البث والتعامل مع الأحداث، AFAIK هو التحكم.باستخدام واجهة برمجة التطبيقات المتدفقة، يمكنك الاطلاع على مستندك خطوة بخطوة والحصول على المحتويات التي تريدها.في حين أن واجهة برمجة التطبيقات المستندة إلى الحدث يمكنك فقط التعامل مع ما يهمك.

نصائح أخرى

بعد قليل من العبث، يبدو أن الإجابة هي استخدام إصدارات قارئ/كاتب الأحداث بدلاً من إصدارات البث.

(أي.javax.xml.stream.XMLEventReader وjavax.xml.stream.XMLEventWriter)

أنظر أيضا http://www.devx.com/tips/Tip/37795, ، وهو ما جعلني أتحرك أخيرًا.

أعلم أن هذا سؤال قديم إلى حد ما، ولكن إذا كان أي شخص آخر يبحث عن شيء مثل هذا، فهناك بديل آخر:تحتوي واجهة برمجة تطبيقات ملحق Woodstox Stax2 على الطريقة:

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

الذي ينسخ الحدث المشار إليه حاليًا من قارئ الدفق باستخدام كاتب الدفق.هذه ليست بسيطة فحسب، بل فعالة للغاية.لقد استخدمته لإجراء تعديلات مماثلة بنجاح.

(كيفية الحصول على XMLStreamWriter2 وما إلى ذلك؟تنفذ جميع المثيلات المقدمة من Woodstox هذه الإصدارات الموسعة - بالإضافة إلى وجود أغلفة في حالة رغبة شخص ما في استخدام متغيرات Stax "الأساسية" أيضًا)

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