2013-07-03 2 views
0

나는 아파치 JSPWiki 팀을 기다리고 있으며 JDOM 1.1.2에서 JDOM 2.0.5로 프로젝트를 업그레이드하려고합니다. 변환의 98 %는 정상적으로 작동하지만 JDOM2의 XMLOutputter.outputElementContent()와 관련된 업그레이드를 방해하는 한 가지 문제가 발생했습니다. 즉, 항상 출력 이스케이프를 사용하지 않도록 처리 명령을 추가하지만 속성 내의 앰퍼샌드 및 따옴표는 & amp으로 이스케이프 처리됩니다. & ". JDOM1은이 PI를 원하는대로 처리하지만 JDOM2는이 명령을 해석하여 속성 값 내에서 이스케이프 처리 출력을 차단합니다. 이것이 JDOM2의 버그/기능인지 또는 JSPWiki가 JDOM1의 버그/기능에 부적절하게 의존하고 있는지 확실하지 않습니다. [1]은 outputElementContent()를 호출하기 전에 JSPWiki에서 Format 요소를 구성하는 방법을 보여줍니다. 예를 들어, JDOM1에비활성화 출력 이스케이프 PI 세트가있는 JDOM 2의 속성 값 이스케이프

:

<a href="http://www.google.com/?p=a&c=d">Hello</a> 

같이 렌더링 얻는다 :

<a href="http://www.google.com/?p=a&amp;c=d">Hello</a> (good, ampersand is escaped) 

이는, JDOM1에서 XMLOutputter.printAttibutes() [2]에 관계없이 처리의 속성치 탈출 교수.

하지만

는 JDOM2에서 우리가 얻을 :

<a href="http://www.google.com/?p=a&c=d">Hello</a> (bad, still an ampersand character) 

... JDOM2에, AbstractXMLOutputProcessor의 attributeEscapedEntitiesFilter [3] 할 것입니다 때문에 탈출하는 경우에만 "getEscapeOutput()"사실이지만, getEscapeOutput가 자동으로 false로 설정되어 [4] 비활성화 출력 이스케이프 PI가 설정된 경우.

우리가 Format.setIgnoreTrAXEscapingPIs()를 호출하면 (또는 그냥 비활성화 출력 이스케이프 처리 PI를 추가하지 않으면) 이스케이프 처리되는 태그의 반대 문제가 발생하게됩니다.

누구나 우리에게 좋은/간단한 해결책을 생각할 수 있습니까?

감사 글렌

[1] http://svn.apache.org/viewvc/incubator/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/render/XHTMLRenderer.java?revision=1486481&view=markup#l56

[2] http://grepcode.com/file/repo1.maven.org/maven2/org.jdom/jdom/1.1/org/jdom/output/XMLOutputter.java#1132

[3] http://grepcode.com/file/repo1.maven.org/maven2/org.jdom/jdom2/2.0.4/org/jdom2/output/support/AbstractXMLOutputProcessor.java#392

[4] http://grepcode.com/file/repo1.maven.org/maven2/org.jdom/jdom2/2.0.4/org/jdom2/output/support/AbstractXMLOutputProcessor.java#665

+1

안녕하세요. 나는 이걸 생각하고있어. 너도 알다시피. 본능은 JDOM 2.x가 올바른 일을하고 있다고 말하는 것입니다 .... JDOM이 아닌 다른 엔진을 사용하여 테스트하는 것은 비교적 쉬워야하지만 .... 다른 엔진이 제대로하고 있다고 말할 수있는 사람이 있습니다. 필자의 본능은 valeus가 Text 콘텐츠와 동일하게 처리되어야한다는 것입니다 (JDOM 2.x가하는 일입니다). 이것은 JDOM 1.x 측에 대한 테스트 케이스가있는 것이 아니기 때문에 JDOM 1에서는 선례가 없습니다.x 따라와. 일반적으로 1.x와 2.x 사이의 기능적 호환성을 유지하는 데는 매우주의해야합니다. 그것을 들여다 볼 것입니다. – rolfl

+0

글쎄, 그것은 속성 값이 텍스트 내용과 동일하게 취급되는 것이 아니라 엘리먼트처럼 취급되는 것처럼 보였다. 즉, 모든 것이 든 아니든 (그러나 나는 코드를 잘못 읽었을 수있다.) HTML 앵커 태그 앵커 주위에 중괄호를 유지하고 싶지만 (이스케이프 처리하지 말고) 동시에 속성 값과 텍스트 내용의 앰퍼샌드가 이스케이프 처리되는지 확인하십시오. JDOM2는 이미이 옵션을 제공합니까? (BTW, 빠른 응답을 주셔서 감사합니다.) –

답변

0

I 간단한 해낸 솔루션 :

http://svn.apache.org/viewvc/incubator/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/render/CustomXMLOutputProcessor.java?revision=1499446&view=markup

... 다음 XMLOutputter를로 (라인 62)을 연결 :

내가 출력 이스케이프의 더 이상 검사를 오버라이드 (override) attributeEscapedEntitiesFilter()와 AbstractXMLOutputProcessor의 서브 클래스를 만들어 사용할 수 없습니다 http://svn.apache.org/viewvc/incubator/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/render/XHTMLRenderer.java?revision=1499446&view=markup#l62

이제 제대로 작동합니다.

+0

우수합니다. 원하는 방식으로 수업을 쉽게 재정의 할 수 있다는 것을 알게되어 매우 기쁩니다. 이것은 API가 '올바른'것으로 설정되었음을 증명하는 것입니다. 나는 도망가는 PI를위한 일종의 사양을 찾고 있었고, 부족한 것으로 나타났습니다. 나는 옳은 대답이 무엇인지 모른다. 이 수정 프로그램이 잘 작동합니다. 자주 출력하는 경우 사용자 정의 클래스를 정적 ​​최종 인스턴스로 만들 수 있습니다 .... 더 잘 컴파일 할 수 있습니다 (JIT). – rolfl