2016-12-14 20 views
1

libxml2와 C++를 사용하여 두 xml 파일을 병합하려고합니다.
이 XML 파일은 스키마가 같지만 내용이 다르므로 일부 요소를 기본 XML 파일에 병합해야합니다. 그리고 이들 xml 파일은 들여 쓰기가 다릅니다.libxml2로 병합 된 xml 파일 들여 쓰기

xmlDocPtr doc1 = xmlParseFile(...); 
xmlDocPtr doc2 = xmlParseFile(...); 

xmlNodePtr node_from_doc1; 
for (node; ...) { 
    ... 
    xmlAddNextSibling(node_from_doc1, node); 
    ... 
} 

xmlSaveFormatFile("merged.xml", doc1, 1); 

그리고 병합 된 XML 파일이 잘 들여 쓰기되지 않습니다

가 여기 내 의사 코드 (하나는 공간이 있지만, 또 다른 탭이).

<root_elem attr1="attr"> 
    ... 
    <child>child_text</child> 
    <child_merged>child_merged</child_merged> 
</root_elem> 

'child'요소와 'child_merged'요소는 들여 쓰기가 동일해야합니다.

어떻게 병합 파일을 들여 쓰기 할 수 있습니까? 미리 감사드립니다.

답변

1

설명서에 "format = 1xmlIndentTreeOutput = 1 또는 xmlKeepBlanksDefault(0)이 호출 된 경우에만 노드 들여 쓰기를 제공합니다."

의사 코드 예제에 이러한 코드가 들어 있지 않으므로 문제가 될 수 있습니다.

또한 xmlstarlet format 또는 xmllint --format과 같은 도구를 사용하여 xml 파일을 나중에 다시 들여 쓰거나 들여 쓸 수 있습니다.


UPDATE : 가 좀 더 많은 연구를했고, 무엇을 당신이하려고하는 것은 libxml2를 불가능 것처럼 보인다. FAQ 인용하려면 문서의 내용에 모든 공백 때문에 문서의 내용에 공간을 발명하지

libxml2를을 중요하다. 당신은 API에서 나무를 구축하고 싶다면 들여 쓰기 :

  1. 올바른 방법도 그 자신을 생성하는 것입니다.
  2. 위험한 방법은 ... 당신의 콘텐츠에 그 공백을 추가 libxml2를 물어
  3. 말했다되고 그건

, 내가 xmlKeepBlanksDefault (0)를 사용하여 제대로 들여 출력을 얻을 관리 않았다입니다. 하지만 두 개의 문서를 병합하지 않았습니다. 하나를로드하고 노드를 삽입했습니다. 그래서 당신을 위해 작동하지 않는다면, 당신이 합병하는 노드가 공백을 포함하기 때문일 것입니다. 따라서 삽입하기 전에 트리밍을 시도 할 수 있습니다.

당신이하려는 일에 대한 완전한 예를 게시하지 않으면 조언하기가 어렵습니다.

+0

나는'xmlKeepBlanksDefault (0)'을 호출했지만 작동하지 않는다 ... – Jeremy

+1

@ 제레미 나는 알았다. 파싱하기 전에 * 호출했습니다. Se 업데이트 된 답변. –

+0

Ooops, 구문 분석 후'xmlKeepBlacnksDefault (0)'을 호출했습니다. 이제 파싱하기 전에이 API를 호출하는 들여 쓰기 된 XML을 얻을 수 있습니다! – Jeremy