2011-03-29 4 views
0

jdom 중복 네임 스페이스 선언을 제거하는 것으로 보입니다. 이것은 XML 문서가 OAI-PHM (open archive initiative)과 같은 다른 XML 구조에 삽입 될 때의 문제입니다. 주변 XML이 컨테이너이고 임베디드 문서가 나중에 추출되면 문제가 될 수 있습니다.jdom 중복 된 네임 스페이스 선언 (xmloutputter)을 제거합니다.

다음은 몇 가지 코드입니다. 포함 된 XML은 동일한 이름의 문자열에 포함됩니다. xsi 네임 스페이스를 선언합니다. 우리는 xsi 네임 스페이스를 선언하는 jdom 컨테이너를 생성한다. 문자열을 파싱하고 포함합니다. 우리가 모든 것을 인쇄 할 때 내부의 xsi 네임 스페이스가 없어졌습니다.

public static final Namespace OAI_PMH= Namespace.getNamespace(   "http://www.openarchives.org/OAI/2.0/"); 
public static final Namespace XSI = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
public static final String SCHEMA_LOCATION = "http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"; 
public static final String ROOT_NAME  = "OAI-PMH"; 


String embeddedxml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <myxml xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"" 
+ "http://www.isotc211.org/2005/gmd" 
+ " http://www.ngdc.noaa.gov/metadata/published/xsd/schema/gmd/gmd.xsd" 
+ " http://www.isotc211.org/2005/gmx" 
+ " http://www.ngdc.noaa.gov/metadata/published/xsd/schema/gmx/gmx.xsd\">\"" 
+ "</myxml>"; 

// loadstring omitted (parse embeddedxml into jdom) 
Element xml = loadString(embeddedxml ,false); 

Element root = new Element(ROOT_NAME, OAI_PMH); 
root.setAttribute("schemaLocation", SCHEMA_LOCATION, XSI); 

// insert embedded xml into container structure 
root.addContent(xml); 


XMLOutputter out = new XMLOutputter(Format.getPrettyFormat()); 


// will see that the xsi namespace declaration from embeddedxml is gone 
out.output(root,System.out); 

나는이 동작에 대해 XMLoutputter가 책임이 있다고 생각합니다. 어떤 힌트를 어떻게 중복 네임 스페이스를 보존 할 수 있습니까?

감사

커트

+3

왜 문제가됩니까? 네임 스페이스가 임베디드 XML에서 실제로 사용되면 임베디드 XML 추출시 매핑이 "복원"됩니다. –

+0

실제로. XML API는 요소가 새 문서로 이동 될 때 네임 스페이스 선언을 관리합니다. JDOM은 중복 된 정의를 제거하는데 아주 옳습니다. – skaffman

+0

문제는 추출물 인 것 같습니다. AFAIK 대부분의 OAI 수확기가 동작하는 방식은 문자열 수준에서 포함 된 xml을 "잘라내"만한다는 것입니다. xml은 파싱되지 않습니다. 따라서 XML 구조와 네임 스페이스에 대한 지식이 없습니다. 내 예제에서는 xsi : schemaLocation = .. 컨테이너 구조 밖으로 포함 된 xml 잘라낼 경우 xsi 정의되지 않고 볼 수 있습니다. – user671534

답변

0

뭔가 코드에서 누락되었습니다 final static String ROOT_NAME의 선언이 표시되지 않고 Element xml IST 초기화 후 사용되지 않습니다.ROOT_NAME이 다른 곳 "myxml"로 초기화됩니다

경우, 문제에 대한 해결책은 당신이 당신의 문서에 xml 요소를 추가하지 않는 것이이며, 그 결과는 당신이 그렇게 것처럼 보인다.

+0

삽입 된 xml (xml)이 컨테이너 (루트)에 추가되는 코드의 중요한 부분을 깜박했습니다. 지금 거기에있다. – user671534

관련 문제