2014-05-20 3 views
0

원본에 일부 데이터 값이 포함 된 노드를 설정 한 후이 노드의 빈/null 텍스트 값을 축약 형 형식 : 텍스트와LibXML : 축약 된 노드를 반환하는 것처럼 노드의 텍스트 내용을 null로 변경 한 후

:

<frog>green</frog> 

축약 형태 :

<frog/> 

현재 코드 :

,536,
foreach my $child ($node->getChildnodes()) 
    { 
    if ($child->nodeType == XML_TEXT_NODE) 
    { 
     my $data = $child->getData(); 
     $data =~ s/(?$case_flag)$sv/$rv/g; 
     $child->setData ($data); 
     #my $xyz = $parser->parse_balanced_chunk ($node->toString(0))->toString(0); 
    } 
    } 

주석 처리 된 줄은 내가 원하는 것을 반환하지만이 태그를 단축 태그가있는 문서로 다시 가져올 수 없습니다.

답변

2

축약 태그 (예를 들어 <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> 
+0

얘들 아, 나는 듣고 정말 정말 멋진, 토론을 주셔서 감사합니다. Ikegmi 값을 테스트하고 값이 null/empty 인 경우 자식 노드를 제거하는 해결책을 완전히 이해합니다. 그러나 이상한 점은 null 값을 가진 생략되지 않은 태그를 저장 한 다음 다른 값을 변경하기 위해 코드를 다시 실행하면 (즉, 같은 태그를 건드리지 않음), 빈 값이있는 매우 간단한 생략되지 않은 태그가 축약됩니다. . 다른 단어, 처음에 같은 파일을로드 할 때 XML 파일을 저장할 때 기대했던대로 다른 모든 널 텍스트 태그가 abreviated됩니다. – CraigP

+0

setData cmd 때문입니까? – CraigP

+0

당신이 묻고있는 것이 확실하지 않지만 아마도 XML에 대답 할 것입니다. XML :: LibXML은 입력 XML의 요소에 어떤 형식이 사용되었는지 상관하지 않습니다. 태그가 원래 축약되었는지 여부를 추적하지는 못합니다. 요소가 자식이 있는지 없는지에 따라 출력 할 양식을 간단히 선택합니다. – ikegami

1

축약 된 태그 (예 : <frog/>)는 속성을 제외하고 자식이없는 요소의 가능한 표현입니다. 요약되지 않은 양식 (<frog></frog>)과 완전히 같습니다. 생성자 —에 전달 된 옵션을 통해 파서의 출력 중 일부를 제어 할 수 있습니다. 'no_blanks'옵션 —을 통해 빈 노드를 제거하도록 구문 분석기에 지시 할 수 있지만 가능한 경우 XML :: LibXML이 축약 태그를 출력하도록하는 옵션이 없습니다.

은 당신이 생각 할 수있는 것은 XML 문서를 직렬화 한 후 정규 표현식을 적용하는 것입니다 :

xyz =~ s{<\s*([^>]+)\s*>\s*</\s*\1\s*>}{<$1/>}g;