2009-08-06 8 views
2

필터링 프로세스의 일부로 XML 문서에서 특정 태그를 제거하고 싶습니다. 그러나 XML의 모양이나 구조를 수정할 수는 없습니다.구조를 보존하면서 XML 필터링

입력 XML 문자열의 예로서 제공 :

<?xml version="1.0" encoding="UTF-8"?> 
<main> 
    <mytag myattr="123"/> 
    <mytag myattr="456"/> 
</main> 

및 출력이 속성 값이 말하자면, 어디 mytag을 제거하기 위해 필요, 456, • DIFF가 표시되어야합니다

<?xml version="1.0" encoding="UTF-8"?> 
<main> 
    <mytag myattr="123"/> 
</main> 

제거 된 태그 만 입력 및 출력 간의 차이로.

SAX, StAX 및 JAXB를 조사했지만 이러한 API로 입력 한 형식과 동일한 형식으로 XML을 출력 할 수없는 것처럼 보입니다. 대신 적절한 들여 쓰기와 공백을 사용하여 잘 구성된 XML을 작성하며, 때로는 입력과의 차이점을 나타내는 것처럼 보일 것입니다.

내 현재 메서드는 정규식을 사용하지만 위의 XML을 구성하는 모든 가능한 방법을 고려하지 않으므로 매우 강력하지는 않습니다. 예를 들어, 속성 값과 일치합니다 : 이것은 위의 예에서 작동

myAttr\s*=\s*"([^"]*)" 

을하지만,이 XML 태그 주어 작동하지 않습니다

<mytag myattr= 
    123></mytag> 

정규식 정말이 상황에서 최선의 선택인가를 ?

답변

5

XML을 구문 분석하기 위해 정규식을 사용하지 마십시오. 당신은 이미 시도 할 때 어떤 일이 일어 났는지 알고 있습니다. I have a spiel on why this is.

귀하의 경우에는 XSLT을 사용해야합니다. 당신이 원하는 것을하기위한 XSLT 파일은 매우 간단하고 쉽게 따라 할 수 있습니다. 그것은 다음과 같은 기본적이다 : 한이 속성 myattr=123하지 mytag의 어떠한 요소를 복사합니다

<xsl:template match="mytag[@myattr=123]"> 
</xsl:template> 
<xsl:template match="*|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="*|@*" /> 
    </xsl:copy> 
</xsl:template> 

.

필자는 예제 파일에서이 파일을 테스트하고 원하는 출력을 얻었습니다.

Java로 XSLT를 사용하는 방법은 an entire book has been written on the subject입니다. 당신은 아마도 당신이 선호하는 XML 라이브러리를 사용할 수 있습니다. Java로 XSLT를 실제로 사용한 적은 한번도 없기 때문에 어느 라이브러리를 가장 쉽게 사용할 수 있는지 말할 수는 없습니다.

+0

XSLT를 살펴볼 것이지만 입력 XML의 구조를 보존 할 것입니다. 필자가 제시 한 예제는 형식이 잘 맞았지만 샘플 XML이 모두 한 줄에 있다고 상상해보십시오. 출력도 모두 한 줄로 표시됩니까? –

+0

@Alex Spurling : XML은 전적으로 직렬화 형식이 아니라 데이터와 관련이 있어야합니다. 왜 당신에게 중요한가? – Tomalak

+0

그는 비 XML 인식 diff 도구를 사용하기 때문에. –

관련 문제