2009-01-05 18 views
9

Làm cách nào để một trình phân tích cú pháp XML tôn trọng khoảng trắng đầu và cuối?Bạn có thể bảo toàn khoảng trống đầu và cuối trong XML không?

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

in Trên ra 3.

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

Trên in ra 1. (Tôi muốn nó in 2).

Có điều gì đặc biệt mà tôi có thể tự đặt vào tài liệu xml để cho trình phân tích cú pháp giữ khoảng trống đầu và cuối trong tài liệu không?

KIỂM TRA 1: Có thuộc tính có thể được chỉ định ONCE ở đầu tài liệu để áp dụng cho tất cả các phần tử không?

CLARIFICATION 2: Do nội dung của các thực thể có thể có dữ liệu unicode, nhưng tệp xml cần phải là ascii đơn giản, tất cả các thực thể được mã hóa - nghĩa là không may CDATA không khả dụng.

+0

CDATA chắc chắn là có sẵn. Tuy nhiên, bạn có thể chỉ phải sử dụng nhiều hơn một giá trị phần tử. –

+0

@michaelpryor: Giới thiệu về tất cả các câu trả lời đề xuất "xml: space". Vấn đề này không liên quan gì đến xml: space, điều khiển cách một trình phân tích cú pháp xử lý các nút trắng - chỉ *. Các nút được hiển thị chắc chắn không chỉ khoảng trắng. Xem giải pháp của tôi, đó là giải pháp duy nhất thực sự xử lý vấn đề. Chúc mừng, –

+1

Vấn đề có * không có gì * để làm với CDATA. CDATA chỉ có tại thời gian phân tích cú pháp, trong infoset, nó không còn hiện diện và khoảng trắng * là * một phần của infoset. – bortzmeyer

Trả lời

8

Như tôi đã nhận xét, tất cả các câu trả lời đề xuất việc sử dụng các xml:space="preserve" là sai.

Các xml:space thuộc tính chỉ có thể được sử dụng để kiểm soát việc điều trị các khoảng trắng chỉ các nút, đó là các nút văn bản gồm hoàn toàn ký tự khoảng trắng.

Điều này hoàn toàn không xảy ra với sự cố hiện tại.

Trong thực tế, các mã được cung cấp dưới đây một cách chính xác có được chiều dài 2 cho nút văn bản chứa trong:

<xml> 2</xml> 

Đây là mã VB mà được một cách chính xác độ dài của nút văn bản (không quên để thêm một tham chiếu đến "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 

Nếu bạn đặt một breakpoint trên dòng:

wscript.echo Len(n) 

bạn sẽ thấy rằng khi trình gỡ lỗi phá vỡ ở đó, giá trị của n là 2, vì nó là bắt buộc.

Vì vậy, mã này là giải pháp đang được tìm kiếm.

+0

thuộc tính xml: space = "preserve" được làm việc. Tôi không biết ai đã xóa các câu trả lời gợi ý nó, nhưng điều đó làm việc tốt cho tôi. –

+2

@michaelpryor: Chính xác hơn, câu trả lời cho orig. q. là: "Không, không có gì đặc biệt cần được đặt trong tài liệu XML vì trình phân tích cú pháp không cắt bất kỳ nút văn bản không phải là khoảng trắng nào. Đơn giản chỉ cần sử dụng thuộc tính" nodeValue "và không sử dụng thuộc tính" văn bản " –

+0

Trên dòng gán giá trị cho 'n', chúng ta có' Len' không? – Jaywalker

3

bạn có thể thử đưa nó vào một khối CDATA:

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

Đối với tất cả các câu trả lời bằng "xml: space": Vấn đề này không liên quan gì đến xml: space, điều khiển cách trình phân tích cú pháp xử lý các nút trắng - chỉ *. Các nút được hiển thị chắc chắn không chỉ khoảng trắng. –

+0

Theo điều tôi ưu tiên. bình luận Tôi khuyên bạn nên rút các câu trả lời sai hoặc những người khác hoàn toàn downvote chúng. Chúc mừng, –

+0

Các infoset là chính xác giống nhau, có hoặc không có CDATA. Đây không phải là vấn đề. – bortzmeyer

3

Như đã đề cập bởi Dimitre Novatchev, đối với XML, khoảng trống sẽ không bị xóa theo ý muốn của trình phân tích cú pháp. Khoảng trắng là một phần nếu giá trị của nút là . Vì tôi không nói Visual Basic, đây là một chương trình C với libxml in độ dài của nút văn bản đầu tiên. Có hoàn toàn không cần phải đặt xml: dấu cách.

% ./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 

Đây là chương trình:

#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; 
} 
Các vấn đề liên quan