2012-12-05 4 views
3

Groovy를 처음 사용하고 간단한 문제가 있습니다. 내가 원하는 것은 하나의 XML 파일에서 특정 요소를 추출하고 그 파일로 새 파일을 만든 것 뿐이다.Groovy : 한 문서에서 다른 문서로 XML 요소를 복사하십시오.

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.group</groupId> 
    <artifactId>artifact</artifactId> 
    <version>1.4</version> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <scope>test</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

내가 그루비에서 XML을 구문 분석하는 방법을 알고 : 나는 또한 그루비에서 XML을 생성하는 방법을 알고

def project = new XmlParser().parse("pom.xml") 
project.groupId.each{ 
    println it.text() 
} 

: 다음 예제 XML이야,의는 메이븐 POM 파일을 사용하게

def xml = new groovy.xml.MarkupBuilder() 
xml.project(){ 
    modelVersion("artifactId") 
    groupId("com.group") 
    artifactId("artifact") 
} 

그러나 두 가지를 결합하는 데 문제가있는 것 같습니다. 예를 들어, groupId, artifactId 및 전체 개의 종속성 트리를 가져 와서 새 XML을 만듭니다. 그다지 열심히 할 수는 없으며 Groovy의 단순함을 활용하고 싶습니다. 그 라인을 따라

뭔가 (물론이 작동하지 않음) :

def newXml= new groovy.xml.MarkupBuilder() 
newXml.groupId= project.groupId 
newXml.dependencies = project.dependencyManagement.dependencies 

감사합니다. 그 코드는 많은 도움이하지만 즉, 네임 스페이스를 처리 할 수있는 방법 입력에서 프로젝트 태그처럼 보이는 경우 :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

그것은 다음 출력에 몇 가지 이상한 주석을 추가하고있다. 내가 원했던 것은 결과물의 프로젝트 태그도 비슷하게 보인다는 것입니다.

+0

답변이 여기에있을 수 있습니다 : http://stackoverflow.com/questions/1372771/splitting-child-node-from-xml-file-into-their-own-xml-files – djangofan

+0

@Jonas 업데이트 됨 네임 스페이스 지원을 추가하려면 –

답변

6

당신은 XmlSlurper으로이 작업을 수행 할 수 있습니다 인쇄 어떤

import groovy.xml.* 

def pxml = '''<project> 
      | <modelVersion>4.0.0</modelVersion> 
      | <groupId>com.group</groupId> 
      | <artifactId>artifact</artifactId> 
      | <version>1.4</version> 
      | <dependencyManagement> 
      | <dependencies> 
      |  <dependency> 
      |  <groupId>junit</groupId> 
      |  <artifactId>junit</artifactId> 
      |  <version>4.8.2</version> 
      |  <scope>test</scope> 
      |  </dependency> 
      | </dependencies> 
      | </dependencyManagement> 
      |</project>'''.stripMargin() 

def p = new XmlSlurper().parseText(pxml) 

String nxml = new StreamingMarkupBuilder().bind { 
    project { 
    dependecyManagement { 
     dependencies { 
     mkp.yield p.dependencyManagement.dependencies.children() 
     } 
    } 
    } 
} 

println XmlUtil.serialize(nxml) 

:

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <dependecyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <scope>test</scope> 
     </dependency> 
    </dependencies> 
    </dependecyManagement> 
</project> 

더 네임 스페이스를 처리하기 위해, 당신은 시도 할 수 :

def pxml = '''<project xmlns="http://maven.apache.org/POM/4.0.0" 
      |   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      |   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
      | <modelVersion>4.0.0</modelVersion> 
      | <groupId>com.group</groupId> 
      | <artifactId>artifact</artifactId> 
      | <version>1.4</version> 
      | <dependencyManagement> 
      | <dependencies> 
      |  <dependency> 
      |  <groupId>junit</groupId> 
      |  <artifactId>junit</artifactId> 
      |  <version>4.8.2</version> 
      |  <scope>test</scope> 
      |  </dependency> 
      | </dependencies> 
      | </dependencyManagement> 
      |</project>'''.stripMargin() 

def p = new XmlSlurper().parseText(pxml) 

String nxml = new StreamingMarkupBuilder().bind { 
    mkp.declareNamespace( '':"http://maven.apache.org/POM/4.0.0", 
         'xsi':"http://www.w3.org/2001/XMLSchema-instance") 
    project('xsi:schemaLocation':[email protected]) { 
    dependecyManagement { 
     dependencies { 
     mkp.yield p.dependencyManagement.dependencies.children() 
     } 
    } 
    } 
} 

println XmlUtil.serialize(nxml) 

당신을 제공해야하는 :

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <dependecyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <scope>test</scope> 
     </dependency> 
    </dependencies> 
    </dependecyManagement> 
</project> 
+0

고마워요. 꿈처럼 지금 일합니다. – Jonas

관련 문제