2016-09-24 3 views
-1

동일한 내용이지만 다른 줄에있는 두 개의 XML 파일을 비교하려고했습니다. 이를 극복하기 위해, 나는 자식 노드 중 하나 (일반적으로 두 파일의 위치가 다른 노드 중 하나)에서 XML을 정렬하려고했습니다.노드 값을 기반으로 XML 파일 정렬

는 여기에 내가 <RC> 부모 노드에 대한 <membId> 노드를 기반으로 정렬하는 데 노력하고 내 샘플 XML 파일

<Report> 
<rptName>Sample</rptName> 
<reportNameGrp> 
<grpName>AggrDataSet</grpName> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 103</membLglNam> 
<membId>RC103</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 055</membLglNam> 
<membId>RC055</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 047</membLglNam> 
<membId>RC047</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 015</membLglNam> 
<membId>RC015</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
<RC> 
<rptSubHdr> 
<membLglNam>Registered Customer 024</membLglNam> 
<membId>RC024</membId> 
<relCM>CM022</relCM> 
</rptSubHdr> 
</RC> 
</reportNameGrp> 
</Report> 

입니다. 어떤 방법을 사용해도 내 문서를 정렬하지 못합니다. XSLT를 사용해 보았지만 정렬이 작동하지 않습니다. 필자는 파이썬 스크립트 작성을 시도해 보았지만 분류 작업을 수행하지 못했습니다. I 스크립트를 실행하는 데 python test.py 2.xml membId를 실행 (즉 2.xml을 유의하시기 바랍니다 입력 XML의 파일 이름이고 membId 내가 찾고있는 태그입니다)

import sys 
from lxml import etree 

filename, tag = sys.argv[1:] 

doc = etree.parse(filename, etree.XMLParser(remove_blank_text=True)) 
root = doc.getroot() 
root[:] = sorted(root, key=lambda el: el.findtext(tag)) 
print etree.tostring(doc, pretty_print=True) 

-

여기 내 파이썬 스크립트입니다.

내가 잘못 가고있는 곳에서 어떤 도움을 주셔서 감사합니다. 나는 파이썬으로 시작하고있다. 그래서 나는 꽤 명백한 실수를했을지도 모른다. 파이썬 스크립트 또는 XSLT 솔루션 (둘 중 하나)이 나에게 도움이 될 것입니다!

+2

** 1 ** "* 나는 XSLT를 사용했지만, 정렬하지 않습니다. *. "코드를 처음부터 작성하는 대신, 고칠 수 있도록 시도를 게시하십시오. - ** 2 ** ** 부모 노드에 대해 노드를 기반으로 한 정렬은 다소 수수한 요구 사항이므로 예상 출력도 게시하십시오. - ** 3. ** 귀하의 질문에 'XSLT 2.0'태그가 붙은 이유는 무엇입니까? 실제로 XSLT 2.0을 지원하는 프로세서를 사용하고 있습니까? –

+1

파이썬의 lxml은 libxslt 프로세서를 사용하는 XSLT 1.0 만 지원합니다. – Parfait

+0

@ michael.hor257k 그 ​​부분에 대한 도움을 구하는 XSLT와 함께 또 다른 질문을 게시 할 것입니다. 그리고 예, 저는 XSLT2.0을 사용하고 있었고 그 때문에 태그를 붙였습니다. – Incognito

답변

2

다음 XSLT 스크립트와 Python의 lxml 통합을 고려하십시오. 또한 동적 명령 행 프로세스를 실행하려고 시도합니다. 불행하게도, XSLT는 구조화 할 노드의 종류에 따라 구조적으로 바뀔 것입니다. 아래는 것입니다 특별히 종류의 <membId> 오름차순 :

XSLT

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

    <!-- Identity Transform --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Sort MembId under RC/rptSubHdr --> 
    <xsl:template match="reportNameGrp"> 
    <xsl:copy>  
     <xsl:copy-of select="grpName"/> 
     <xsl:apply-templates select="RC">   
      <xsl:sort select="rptSubHdr/membId" order="ascending"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

파이썬

import lxml.etree as et 

// LOAD XML AND XSL SOURCES 
dom = et.parse('Input.xml') 
xslt = et.parse('XSLTScript.xsl') 

// TRANSFORM 
transform = et.XSLT(xslt) 
newdom = transform(dom) 

// SAVE TO FILE 
with open('Output.xml', 'wb') as f: 
    f.write(newdom) 
+0

이것은 grpName 요소를 버립니다. –

+0

감사! 그것은 내가 방향을 제시하는 데 도움이되지만 실제로 문제를 해결하지는 못합니다. XSLT와 함께 다른 질문 만 게시하면 문제가 생겨서 도움을 얻을 수 있다고 생각합니다. – Incognito

+0

무엇이 문제입니까? 귀하의 질문 제목과 텍스트는이 대답이하는 노드별로 XML 값을 정렬하는 것에 대해 언급합니다. 원하는 출력으로 자세하게 설명하십시오. 또한 XSLT 1.0은 [document()] (http://www.w3schools.com/xsl/func_document.asp)를 사용하여 다른 파일을 구문 분석 할 수도 있습니다. – Parfait