jaxb -problem z generowaniem xmla

0

Witam,
generuję sobie plik xml za pomocą javax.xml.bind.Marshaller
kod do generowania wygląda tak:

 
        javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT,
                Boolean.TRUE);
        marshaller.marshal(wejscie, out);

Problem w tym, że w wyniku powstają mi pliki wyglądające tak:

<?xml version="1.0" encoding="UTF-8"?>
<Nazwa1 xmlns:prefix="http://www.mynamespace/prefix">
   <Nazwa2 ID="1" version="1.0">
      <Nazwa3 ID="1">
         <Nazwa>123</Nazwa>
         <Nazwa4>321</Nazwa4>
      </Nazwa3>
	  </Nazwa2>
	  </Nazwa1> 

a chciałbym wygenerować coś takiego:

<?xml version="1.0" encoding="UTF-8"?>
<prefix:Nazwa1 xmlns:prefix="http://www.mynamespace/prefix">
   <prefix:Nazwa2 ID="1" version="1.0">
      <prefix:Nazwa3 ID="1">
         <prefix:Nazwa>123</prefix:Nazwa>
         <prefix:Nazwa4>321</prefix:Nazwa4>
      </prefix:Nazwa3>
	</prefix:Nazwa2>
</prefix:Nazwa1> 

Jak zmusić marshallera do dodania prefixów?
Usiłowałem zrobić coś takiego:

        marshaller.setProperty("com.sun.xml.bind.marshaller.NamespacePrefixMapper", new com.sun.xml.bind.marshaller.NamespacePrefixMapper() {

            @Override
            public String getPreferredPrefix(String string, String string1, boolean bln) {
                return "prefix";
            }
        });

ale mówi mi, że nie ma takiej property.
Jakiś pomysł jak to zrobić?

0

Pewnie do tego czasu juz sam doszedles, jak to zrobic. Jesli nie, to:

package-info.java

@XmlSchema(namespace = "http://host.com/MySchema",
		elementFormDefault = XmlNsForm.QUALIFIED,
		attributeFormDefault = XmlNsForm.QUALIFIED,
		xmlns={@XmlNs(namespaceURI = "http://host.com/MySchema", prefix = "ms")})
package host.com.jaxb.sample;

import javax.xml.bind.annotation.*;

package-info.java powinien byc automatycznie wygenerowany przez xjc jesli xsd zawiera targetNamespace. Jesli czesto generujesz szablony klas, mozesz uzupelnic *.xsd:

<xsd:schema targetNamespace="http://host.com/MySchema"
			xmlns:xsd="http://www.w3.org/2001/XMLSchema"
			xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
			xmlns:ms="http://host.com/MySchema"
			jxb:version="2.1"
			elementFormDefault="qualified"
			attributeFormDefault="qualified">
	<!-- ... -->
</xsd:schema>

... ale wtedy, bedziesz musial zdefiniowac wlasny NamespacePrefixMapper, ktory bedzie nadpisywal domyslne nazwy "ns0", "ns1", itd.

	marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
		new com.sun.xml.bind.marshaller.NamespacePrefixMapper() {
			@Override
			public String getPreferredPrefix(String ns, String suggestion, boolean requirePrefix) {
				//...
			}
	});

HTH.

0

hej, dzięki za odpowiedź. package-info.java marshaller mi te QUALIFIED ignoruje. Wpisy w xsd odpadają, bo dostaje xsd z zewnątrz i mogą się zmieniać. "marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper"," -tu również dostaję błąd, że nie ma takiej properties. Pewnie rozwiązaniem by była zmiana implementacji jaxb z domyślnej-ale średnio wiem jak to zrobić.

Póki co generuje xmla, a potem parsuję za pomocą XSL/Transform - trochę na około, ale działa;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1