2013-06-18 2 views
1

동일한 스키마를 모두 준수하는 XML 묶음이 있습니다. 일괄 편집을 원하는 특정 요소는 각 XML 파일마다 정확히 한 번 발생하며 각 파일에 동일한 xPath가 있습니다.XML 파일을 일괄 업데이트하는 방법

e.g. /Valid/HeaderInfo/SoftwareID 

내가 값을 대체 할 수 있도록이 특정 요소에 대해 (내가 더 정확하게 노드의 텍스트 값이라고 생각) 스크립트/프로 시저를 작성하고 내 모든 XML 파일에 해당 업데이트를 수행 할 폴더 그룹의 폴더에 저장합니다. 예를 들어 지금 당장은 다음과 같습니다

<SoftwareID>12451245</SoftwareID> 

내가 대신

<SoftwareID>53623745</SoftwareID> 

되고 싶어요.

저는 프로그래밍의 세계에서 시작하고 있으며 일반적으로 XML 데이터에 대해 배우기 시작했습니다. 시작하는 방법에 대한 기본적인 정보가 필요합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 나는 Altova XMLSpy를 가지고 있으며 스크립팅 구성 요소가 있다는 것을 알고 있습니다. 그러나 특정 프로그래밍 언어 (현재 Visual Basic을 배우고 있음)에서이 작업을 수행하는 것이 더 적절합니까 아니면 이러한 유형의 일괄 업데이트를 수행하기 위해 존재하는 다른 소프트웨어가 있습니까?

나를 올바른 방향으로 인도 할 수있는 정보는 아주 좋습니다.

감사합니다.

업데이트 (06/26/13)

FilingSoftwareId에 XPath를 (업데이트 된 요소 이름은) 실제로 : ValidFiling는 XML 문서의 루트 인으로

ValidFiling/FilingHeader/FilingSoftwareId 

. 당신이 제공하고 업데이트 한 것을 사용했지만, 결과는 Altova XMLSpy에서 XSL 변환을 위해이 XSL 파일을 선택할 때 원래의 XML 파일과 중복됩니다.

두 번째 포괄 템플릿이 문서에 적용될 때 FilingSoftwareID에 대한 업데이트가 원래 값으로 대체 될 가능성이 있습니까?

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/> 
    <xsl:template match="/ValidFiling/FilingHeader/FilingSoftwareId"> 
     <FilingSoftwareId> 
      <xsl:text>243523452345</xsl:text> 
     </FilingSoftwareId> 
    </xsl:template> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
       <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

다시 한번 감사드립니다!

답변

1

신원 변환 XSL을 작성한 다음 원하는 배치 기술 (.bat, VB app 원하는 경우)을 사용하여 해당 폴더의 모든 XML에 해당 XSL을 적용합니다. 변경하려는 특정 요소 또는 요소와 일치하는 항목을 작성한 다음 그 밖의 모든 내용을 그대로 출력하는 일반 템플릿을 포함시킵니다. 그래서 당신은 심지어 그것을 편집 할 필요가 없습니다

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="//Valid/HeaderInfo/SoftwareID"> 
    <SoftwareID> 
     <xsl:text>53623745</xsl:text> 
    </SoftwareID>   
</xsl:template> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

심지어 변환에 매개 변수로 새로운 가치를 전달하기 위해 그 예를 확장 할 수 : 테스트없이

는,이 같은해야한다.

+0

감사합니다. Kevin! 상세한 답변에 감사드립니다. 이 XSL을 사용하면 내 XML 파일은 여전히 ​​원래 스키마에 대한 유효성을 유지합니다. (물론 SoftwareID에 대한 새로운 가치가 유효하다고 가정합니다. 아직 테스트하지는 않았지만 스키마에있는 다른 모든 요소를 ​​통합하여 "완전하게"만들 필요가 있습니까? 따라서 모든 프로그래밍 언어가 XML과 "대화"하여 조작 할 수 있습니까? 또 다른 문제는 가능한 것으로 생각되지만, 새로운 SoftwareID를 각 XML에 +1만큼 증가하는 순차 번호로 설정하고 싶다면 그렇게 할 수 있을까요? – smk081

+0

스키마 부분의 경우 스키마를 XSL에 추가하여 인식, 처리 및 출력되도록합니다. 다른 것을 추가 할 필요는 없으며, @ * | node와 일치하는 템플릿은 기본적인 catch-all이며 명시 적으로 일치하지 않는 모든 것을 일치시킵니다. VB에서는 XSLT 변환기를 호출 할 수있는 언어를 사용할 수 있습니다. 코드에서 XSLCompiledTransform을 사용할 가능성이 높습니다. 예, 변환에 전달 된 매개 변수 (예 : SoftwareID)를 추가하고 XSL에서 해당 매개 변수를 사용할 수 있습니다. –

+0

그리고 이유는 ... XML을 가장 안전하게/최상의 방법으로 조작하기 위해 항상 XML을 인식하는 방법을 사용합니다. 물론 문제를보고 Regex 또는 문자열 조작을 작성하려고 시도 할 수도 있지만 XML을 조작하는 올바른 방법은 아닙니다. XSL을 사용하거나 프로그래밍 방식으로 DOM을 사용해야합니다. Altova XMLSpy를 사용하여 하나의 XML에서 위의 내용을 테스트하거나 전체 디렉토리를 처리하는 데 사용할 수도 있습니다. –

관련 문제