할 수 있습을 보존하는 선도적 공백에서는 XML?
-
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:기 때문에 내용의 엔티티가 있을 수 있습니코드 데이터는 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;
}