هل يمكنك الحفاظ على المسافة البيضاء البادئة والزائدة في XML؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

كيف يمكن للمرء أن يخبر محلل XML باحترام المسافات البيضاء البادئة والزائدة؟

Dim xml: Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml>1 2</xml>"
wscript.echo len(xml.documentelement.text)

المطبوعات أعلاه 3.

Dim xml: Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml> 2</xml>"
wscript.echo len(xml.documentelement.text)

المطبوعات أعلاه 1.(أريد طباعة 2).

هل هناك شيء خاص يمكنني وضعه في مستند xml نفسه لإخبار المحلل اللغوي بالاستمرار في المسافة البيضاء في المستند؟

توضيح 1:هل هناك سمة يمكن تحديدها مرة واحدة في بداية المستند لتطبيقها على جميع العناصر؟

توضيح 2:نظرًا لأن محتويات الكيانات قد تحتوي على بيانات Unicode، ولكن يجب أن يكون ملف xml بتنسيق ascii عادي، يتم تشفير جميع الكيانات - مما يعني أن CDATA غير متوفرة للأسف.

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

المحلول

كما علقت ، جميع الإجابات توصي باستخدام xml:space="preserve" مخطئون.

ال xml:space لا يمكن استخدام السمة إلا للتحكم في معالجة العقد ذات المسافات البيضاء فقط, ، وهي عبارة عن عقد نصية مكونة تماما من أحرف المسافة البيضاء.

وهذا ليس هو الحال على الإطلاق مع المشكلة الحالية.

في الواقع، يحصل الكود الموضح أدناه بشكل صحيح على طول 2 لعقدة النص الموجودة في:

<xml> 2</xml>

إليك رمز VB الذي يحصل على طول عقدة النص بشكل صحيح (لا تنس إضافة مرجع إلى "Microsoft XML، v 3.0"):

Dim xml As MSXML2.DOMDocument
Private Sub Form_Load()
Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml> 2</xml>"
Dim n
n = Len(xml.documentelement.selectSingleNode("text()").nodeValue)
wscript.echo Len(n)
End Sub

إذا وضعت نقطة توقف على السطر:

wscript.echo Len(n)

سترى أنه عندما ينقطع مصحح الأخطاء هناك، فإن قيمة n هو 2، كما هو مطلوب.

ولذلك، هذا الرمز هو الحل الذي كان يتم البحث عنه.

نصائح أخرى

وقد تتمكن من محاولة وضعه في كتلة CDATA:

<xml><![CDATA[ 2]]></xml>

وكما ذكر Dimitre Novatchev، لXML، لا يتم حذف المسافات في الإرادة من قبل المحلل. المساحة البيضاء هو جزء إذا كانت العقدة القيمة. منذ أنا لا أتكلم فيجوال بيسك، هنا هو برنامج C مع libxml الذي يطبع طول العقدة النصية الأولى. هناك على الاطلاق لا حاجة لوضع أكس: الفضاء

% ./whitespace "<foo> </foo>"
Length of " " is 1

% ./whitespace "<foo> 2</foo>"
Length of " 2" is 2

% ./whitespace "<foo>1 2</foo>" 
Length of "1 2" is 3

وهنا هو البرنامج:

#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>

int
main(int argc, char **argv)
{
    char           *xml;
    xmlDoc         *doc;
    xmlNode        *first_child, *node;
    if (argc < 2) {
        fprintf(stderr, "Usage: %s XML-string\n", argv[0]);
        return 1;
    }
    xml = argv[1];
    doc = xmlReadMemory(xml, strlen(xml), "my data", NULL, 0);
    first_child = doc->children;
    first_child = first_child->children;        /* Skip the root */
    for (node = first_child; node; node = node->next) {
        if (node->type == XML_TEXT_NODE) {
            fprintf(stdout, "Length of \"%s\" is %i\n", (char *) node->content,
                    strlen((char *) node->content));
        }
    }
    return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top