2014-10-31 11 views
0

새로운 <class> 요소를 JDOM2가있는 persistence.xml 파일에 추가하려고합니다.JDOM2가 xmlns = ""를 생성하지 않도록하십시오.

persistenceUnitEl.add(new Element("class").addContent(className)); 

문제는 jdom2 항상 <class> 요소에 xmlns="" 추가하는 것입니다.

어떻게 예방할 수 있습니까?

removeAttribute("xmlns")은 작동하지 않으며 removeNameSpace(el.getNameSpace())도 작동하지 않습니다.

답변

3

JDOM은 이미 네임 스페이스에있는 다른 요소에 자식 요소를 추가하는 경우에만 xmlns=""을 추가합니다. XML의 기본 네임 스페이스는 접두사가없는 네임 스페이스입니다. 다음 예제에서 :

<root> 
    <child /> 
</root> 

기본 접두사가없고 기본 네임 스페이스는 ""입니다.

위의 XML 조각

는 의미 상 동일 다음 xmlns="" 의미

<root xmlns="" > 
    <child /> 
</root> 

, 당신이 당신이 '빈'공간 ""에 넣어해야, 접두사가없는 요소를 볼 수있는 시간입니다. 위의 예에서 루트와 자식 요소가 네임 스페이스 http://mynamespace에 있는지

<ns:root xmlns:ns="http://mynamespace"> 
    <ns:child /> 
</ns:root> 

참고하고 : 네임 스페이스에 물건을 넣어 접두어를 갖고 싶어 이제

, 당신은 할 것 해당 네임 스페이스의 접두어는 ns입니다. http://mynamespace되도록 상기 예에서

<root xmlns="http://mynamespace"> 
    <child /> 
</root> 

디폴트 네임 "가"로 변경되어, 현재 프리픽스가없는 요소가에있다 (동일한 의미 등을 갖는다)에 상기 코드는 의미 적으로 동일한 것 기본 네임 스페이스 http://mynamespace. 반복하려면 다음 두 문서는 동일합니다 :

<ns:root xmlns:ns="http://mynamespace"> 
    <ns:child /> 
</ns:root> 

지금

<root xmlns="http://mynamespace"> 
    <child /> 
</root> 

는, 어떤이 모든 문제와 무슨 상관 이죠?

글쎄, 요소 persistenceUnitEl은 ""이 아닌 기본 네임 스페이스에 있어야합니다. PersistenceUnit 네임 스페이스 ...something....에, 위의에서

<tagname xmlns="...something...."> 
    <PersistenceUnit> 
    </PersistenceUnit> 
</tagname> 

: 어딘가에 해당 요소에, 또는 그것의 부모에, 당신은 같은 것을 가지고있다. 지금, 당신은 문서에 요소 new Element("class")을 추가 JDOM을 요구하고있다, 그래서 당신은 점점 : 당신이 ""네임 스페이스 (Namespace.NO_NAMESPACE)에 넣어 JDOM을 말하고 있기 때문에

<tagname xmlns="...something...."> 
    <PersistenceUnit> 
     <class xmlns="" /> 
    </PersistenceUnit> 
</tagname> 

이유입니다. JDOM에 대한 설명서는 new Element(String name)을 참조하십시오.

대신에, 당신이 원하는 무엇을, 부모와 같은 공간에 넣어된다

Namespace parentNamespace = persistenceUnitEl.getNamespace(); 
persistenceUnitEl.add(new Element("class", parentNamespace).addContent(className)); 

이제 진짜 질문은 "클래스"요소가 실제로 같은 네임 스페이스에 속하는지 여부입니다 부모 또는 아닙니다. 그러나 그것은 당신이 대답 할 수있는 질문입니다.

자원 :

+0

감사합니다. 당신의 설명은 네임 스페이스가 어떻게 작동 하는지를 이해하는 데 도움이되었습니다. – AngelAvila

+0

이 답변은 정답으로 받아 들여 져야합니다 (3 년 후에도). – KLiFF

0

제 생각에는 이것이 당신이 원하는 것이라고 생각합니다.

<RootTagname xmlns="...some namespace...."> 
    <SubTag> 
     <NewElement yourAttrib="1"/> 
    </SubTag> 
</RootTagname > 

이것은 사용자가 얻은 것입니다.

<RootTagname xmlns="...some namespace...."> 
    <SubTag> 
     <NewElement xmlns="" yourAttrib="1"/> 
    </SubTag> 
</RootTagname > 

새로운 요소 여기

Element newElement = new Element("NewElement", subElement.getNamespace()); 

전체 코드가를 만들려면 아래의 코드 조각을 사용합니다.

Namespace namespace = Namespace.getNamespace("prefix", ".....some namespace...."); 
XPathBuilder<Element> subTagXpathelementBuilder = new XPathBuilder<Element>("//prefix:SubTag", Filters.element()); 
subTagXpathelementBuilder.setNamespace(namespace); 
XPathFactory xpathFactory = XPathFactory.instance(); 

Document doc = (Document) builder.build(xmlFile); 

XPathExpression<Element> xpath = subTagXpathelementBuilder .compileWith(xpathFactory); 
List<Element> subElementsList = xpath.evaluate(doc); 
for (Element subElement : subElementsList) { 
    Element newElement = new Element("NewElement", subElement.getNamespace()); 

    List<Attribute> newElementAttribList = newElement.getAttributes(); 
    newElementAttribList .add(new Attribute("yourAttrib", "1")); 
    subElement .addContent(newElement); 
}