هل تعتبر الحساسية لفواصل الأسطر في مستندات XML "ممارسة سيئة"؟

StackOverflow https://stackoverflow.com/questions/7277

سؤال

أقوم بإنشاء بعض مستندات XML وعندما يتعلق الأمر بجزء العنوان لدي أجزاء تبدو كما يلي:

<Address>15 Sample St
Example Bay
Some Country</Address>

يحتوي ملف XSLT الذي أستخدمه لتحويل هذا إلى XHTML على بعض القوالب العودية غير التقليدية لتحويل أحرف السطر الجديد داخل السلاسل إلى علامات <br/>.

العمل يسير بشكل جيد؛ولكن هل يعتبر الاعتماد على فواصل الأسطر داخل مستندات XML "ممارسة سيئة"؟إذا كان الأمر كذلك، فهل يوصى بأن أفعل ذلك بدلاً من ذلك؟

<Address><Line>15 Sample St</Line>
<Line>Example Bay</Line>
<Line>Some Country</Line></Address>

يبدو أنه سيكون من المحرج جدًا التفاف كل مكان حيث قد يكون النص الخاص بي عبارة عن أسطر متعددة بعلامات كهذه..

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

المحلول

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

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

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

إذا استمرت في استخدام خطوط الخطوط ، فتأكد من إضافة XML: Space = "Preserve" إلى "العنوان". (يمكنك القيام بذلك في DTD الخاص بك ، إذا كنت تستخدم واحدة.)

واقترح البعض القراءة

غالبًا ما يبدو أن تطبيقات XML تتخذ موقفًا أكثر من المسافة البيضاء لأن القواعد المتعلقة بالأماكن الموجودة في مستند XML حيث لا يهم المساحة البيضاء في بعض الأحيان هذه التطبيقات مجانية لإضافة أو إزالة المساحة البيضاء في أماكن معينة.

نصائح أخرى

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

<Address>15 Sample St
Example Bay
Some Country</Address>

هو بالضبط نفس

<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>

والفرق الوحيد هو كيف تقوم واجهات برمجة التطبيقات المختلفة بالإبلاغ عن ذلك.

أعتقد أن المشكلة الحقيقية الوحيدة هي أنها تجعل قراءة XML أكثر صعوبة.على سبيل المثال

<Something>
    <Contains>
        <An>
            <Address>15 Sample St
Example Bay
Some Country</Address>
        </An>
    </Contains>
</Something>

إذا لم يكن XML الجميل مصدر قلق، فربما لا أقلق بشأنه، طالما أنه يعمل.إذا كان XML الجميل هو مصدر القلق، فسأقوم بتحويل الأسطر الجديدة الصريحة إلى <br /> العلامات أو \n قبل تضمينها في ملف XML.

ماذا عن استخدام السمات لتخزين البيانات، بدلاً من العقد النصية:

<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/>

أنا أعرف استخدام السمات مقابل.غالبًا ما تكون العقد النصية موضوعًا محل نقاش، لكنني متمسك بالسمات بنسبة 95% من الوقت، ولم أواجه أي مشاكل بسبب ذلك.

يعتمد ذلك على كيفية قراءتك وكتابتك لملف XML.

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

إذا كان يتم التعامل مع العلامات يدويًا، فلا يزال من الأفضل إجراء فاصل أسطر فقط، إذا سألتني.

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

إذا كان ملف XML يبدو سيئًا (خصوصًا عندما يتم إنشاؤه تلقائيًا)، مرتب يمكن أن يساعد، على الرغم من أنه يعمل بشكل أفضل مع HTML مقارنة بـ XML.

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

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

إن الإحراج المتمثل في وجود علامة السطر يأتي مع XML العادي، وقد تمت مناقشته كثيرًا في مجال برمجة الرعب. http://www.codinghorror.com/blog/archives/001139.html

مواصفات XML لديها ما تقوله بخصوص مسافة بيضاء و تغذية الأسطر وإرجاع النقل على وجه الخصوص.لذا، إذا قمت بتقييد نفسك بخلاصات الأسطر الحقيقية (x0A)، فيجب أن تكون على ما يرام.ومع ذلك، فإن العديد من أدوات التحرير ستقوم بإعادة تنسيق XML من أجل "عرض أفضل" وربما التخلص من بناء الجملة الخاص.تتمثل الطريقة الأكثر قوة ونظافة من فكرة "< line>< / line>" في استخدام مساحات الأسماء وتضمين محتوى XHTML، على سبيل المثال:

<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address>

لا داعي لإعادة اختراع العجلة عندما يتعلق الأمر بالمفردات القياسية.

لا أرى ما هو الخطأ في <Line> العلامات.
من الواضح أن تصور البيانات مهم بالنسبة لك، وهو مهم بدرجة كافية للاحتفاظ بها في بياناتك (عبر فواصل الأسطر في المثال الأول).بخير.ثم احتفظ بها حقًا، ولا تعتمد على "السحر" للاحتفاظ بها لك.احتفظ بكل جزء من البيانات التي ستحتاج إليها لاحقًا ولا يمكنك استنتاجها بشكل كامل من الجزء المحفوظ من البيانات، واحتفظ بها حتى لو كانت بيانات مرئية (فواصل الأسطر والتنسيقات الأخرى).استغرق المستخدم الخاص بك (المستخدم النهائي لمطور آخر) الوقت الكافي لتنسيق تلك البيانات حسب رغبته - إما أن تخبره (مستند API / نص بالقرب من الإدخال) أنك لا تنوي الاحتفاظ بها، أو - احتفظ بها فقط.

نعم، أعتقد باستخدام CDATA كتلة من شأنها حماية المسافة البيضاء.على الرغم من أن بعض واجهات برمجة تطبيقات المحلل اللغوي تسمح لك بالحفاظ على المسافة البيضاء.

ما يجب عليك فعله حقًا هو تحويل XML الخاص بك إلى تنسيق يحافظ على المساحة البيضاء.

لذا، بدلًا من السعي لاستبدال بـ <br />، يجب عليك لف الكتلة بأكملها في <pre>

بهذه الطريقة، يتم الحفاظ على عنوانك وظيفيًا (سواء قمت بتضمين فواصل الأسطر أم لا) ويمكن لـ XSTL اختيار ما إذا كان سيتم الاحتفاظ بالمسافة البيضاء في النتيجة.

أنصحك إما بإضافة <br/> فواصل الأسطر أو ربما تستخدم كيان فاصل الأسطر - &#x000D;

إذا كنت بحاجة إلى الحفاظ على فواصل الأسطر الخاصة بك، فاستخدم كتلة CDATA، مثل قال القرص

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

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