2013-05-08 5 views
2

У меня возникли проблемы с добавлением пространства имен в собственность в течение некоторого времени. Мое требование состоит в том, чтобы создать xml, который будет иметь url пространства имен для дочернего элемента, а не root. Я использую jaxb с eclipselink moxy, jdk7.jaxb xmlElement пространства имен не работает

<document> 
<Date> date </Date> 
</Type>type </Type> 
<customFields xmlns:pns="http://abc.com/test.xsd"> 
    <id>..</id> 
    <contact>..</contact> 
</customFields> 
</document> 

Classes are: 

@XmlRootElement(name = "document") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = {"type","date", "customFields"}) 
public class AssetBean { 

@XmlElement(name="Type") 
private String type; 
@XmlElement(name="Date") 


@XmlElement(name = "CustomFields",namespace = "http://api.source.com/xsds/path/to/partner.xsd")  
private CustomBean customFields = new CustomBean(); 

//getters/setters here 

}

public class CustomBean { 

private String id; 
private String contact; 
//getter/setter 
} 
package-info.java 
@javax.xml.bind.annotation.XmlSchema (  
xmlns = { 
@javax.xml.bind.annotation.XmlNs(prefix="pns", 
      namespaceURI="http://api.source.com/xsds/path/to/partner.xsd") 
}, 
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED 
) 
package com.abc.xyz 

Я последовал за эту статью для помощи, но не могу получить то, что я пытаюсь http://blog.bdoughan.com/2010/08/jaxb-namespaces.html

Спасибо

ответ

1

Модель предметной области (Root)

В нижеуказанном домене я назначу пространство имен одному из элементов, используя аннотацию @XmlElement.

import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    String foo; 

    @XmlElement(namespace="http://www.example.com") 
    String bar; 

} 

Demo Code

В демо-коде ниже мы создадим экземпляр объекта домена и маршалом его в XML.

import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     Root root = new Root(); 
     root.foo = "FOO"; 
     root.bar = "BAR"; 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

Выход

Ниже выход запуска демо-кода. Элемент, который мы присвоили пространству имен с аннотацией @XmlElement, является надлежащим образом пространством имен, но в корневом элементе появляется объявление пространства имен.

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns:ns0="http://www.example.com"> 
    <foo>FOO</foo> 
    <ns0:bar>BAR</ns0:bar> 
</root> 

Для получения более подробной информации

+0

спасибо за быстрый ответ. Я попробовал все примеры, которые вы указали в своем блоге. К сожалению, мне нужно, чтобы xmlns находился на дочернем узле, чем корневой узел. В настоящее время я устанавливаю xmls на уровне пакета, так как у меня также есть требование для персонализированного префикса пространства имен. есть ли другой способ/настройка для размещения пространства имен на дочернем узле, а не в корне? – user2361862

+0

@ user2361862 - Какая часть вашего документа XML соответствует этому пространству имен? В вашем вопросе ничего нет. –

+0

Согласен, но у клиента есть это требование. Может быть, я должен проверить, что xml снова .. спасибо за помощь. Ваш блог очень помог мне, так как это первый раз, когда я использую jaxb и moxy. – user2361862

Смежные вопросы