축약 태그 (예를 들어 <frog/>
) 속성을 제외하고 자녀가없는 요소의 하나 개의 가능한 표현입니다. 요약되지 않은 양식 (<frog></frog>
)과 완전히 같습니다. 원하는대로 XML :: LibXML은 가능한 경우 축약 된 양식을 사용합니다. 요소가 때 $node->childNodes()
반환 아무 의미가없는 속성을 제외하고 아이가없는 경우
$ perl -MXML::LibXML -e'
my $doc = XML::LibXML->new()->parse_string("<root><foo></foo></root>");
print $doc->toString();
'
<?xml version="1.0"?>
<root><foo/></root>
는 "가능한 경우"를 의미한다.
하지만 귀하의 경우 요소에는 여전히 자식 노드가 있습니다. 값이 비어있는 텍스트 노드가있는 텍스트 노드. 이렇게하면 XML :: LibXML이 요소를 약어로 사용할 수 없습니다. XML :: LibXML에서 요소를 축약하기를 원할 경우 텍스트 노드가 비어 있으면 삭제하는 것은 독자의 몫입니다. 수정 :
for my $child ($node->getChildnodes()) {
if ($child->nodeType == XML_TEXT_NODE) {
my $data = $child->getData();
$data =~ s/(?$case_flag)$sv/$rv/g;
if ($data eq "") {
$node->removeChild($child);
} else {
$child->setData($data);
}
}
}
은 무엇 다음 것은 내가 테스트를 위해 사용하는 코드입니다. 당신이 지금 뭐하는
:
$ perl -MXML::LibXML -e'
my $doc = XML::LibXML->new()->parse_string("<root><foo> </foo></root>");
for my $node ($doc->findnodes("//foo")) {
$_->setData("") for $node->childNodes();
}
print $doc->toString();
'
<?xml version="1.0"?>
<root><foo></foo></root>
수정 :
$ perl -MXML::LibXML -e'
my $doc = XML::LibXML->new()->parse_string("<root><foo> </foo></root>");
for my $node ($doc->findnodes("//foo")) {
$node->removeChild($_) for $node->childNodes();
}
print $doc->toString();
'
<?xml version="1.0"?>
<root><foo/></root>
얘들 아, 나는 듣고 정말 정말 멋진, 토론을 주셔서 감사합니다. Ikegmi 값을 테스트하고 값이 null/empty 인 경우 자식 노드를 제거하는 해결책을 완전히 이해합니다. 그러나 이상한 점은 null 값을 가진 생략되지 않은 태그를 저장 한 다음 다른 값을 변경하기 위해 코드를 다시 실행하면 (즉, 같은 태그를 건드리지 않음), 빈 값이있는 매우 간단한 생략되지 않은 태그가 축약됩니다. . 다른 단어, 처음에 같은 파일을로드 할 때 XML 파일을 저장할 때 기대했던대로 다른 모든 널 텍스트 태그가 abreviated됩니다. – CraigP
setData cmd 때문입니까? – CraigP
당신이 묻고있는 것이 확실하지 않지만 아마도 XML에 대답 할 것입니다. XML :: LibXML은 입력 XML의 요소에 어떤 형식이 사용되었는지 상관하지 않습니다. 태그가 원래 축약되었는지 여부를 추적하지는 못합니다. 요소가 자식이 있는지 없는지에 따라 출력 할 양식을 간단히 선택합니다. – ikegami