문제

어떻게 하나 말 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:기 때문에 내용의 엔티티가 있을 수 있습니코드 데이터는 xml 파일을 요구하는 일반 ascii,모든 기관은 인코딩-의미 CDATA 의 불행하게도 사용할 수 없습니다.

도움이 되었습니까?

해결책

로 논평, 모든 답변을 추천 사용 xml:space="preserve" 는 잘못된.

xml:space 특성하는 데에만 사용될 수 있어 치료의 공백만 있는 노드, 은 텍스트 노드 구성 의 공백 문자입니다.

이 모든 경우에서는 현재 문제입니다.

사실,제공하는 코드는 아래에 제대로 가져온 길이의 2 에 대한 텍스트에 포함된 노드:

<xml> 2</xml>

여기에 VB 는 코드를 제대로 면의 길이를 텍스트 노드 (추가하는 것을 잊지 마세요 참조하"Microsoft XML,v3.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의 경우, 공백은 파서에 의해 마음대로 삭제되지 않습니다. 노드 값이있는 경우 공백이 일부입니다. 나는 Visual Basic을 사용하지 않기 때문에 여기에 C 프로그램이 있습니다.libxml 첫 번째 텍스트 노드의 길이를 인쇄합니다. XML : Space를 설정할 필요가 없습니다.

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