XML binding etc.
-
- Уже с Приветом
- Posts: 1071
- Joined: 18 Nov 2003 22:53
- Location: MA
XML binding etc.
Мне для интервью нужно задачку решить ...
a. Using JAXB or another XML binding framework marshal the object below into XML.
Foo
String[] A;
int B;
b. Transform the XML generated by the binding framework for object Foo into
<?xml version="1.0"?>
<Boo:Hoo xmlns:Boo ="http://www.mysite.com/schema/Boo">
<Boo:A># VALUE OF A#</Boo:A>
…..
<Boo:A># VALUE OF A#</Boo:A>
<Yoo:B xmlns:Yoo ="http://www.mysite.com/schema/Yoo" B=”# VALUE OF B#”/>
<![CDATA[
This is the boo-hoo-yoo response string for mysite.com
]]>
</Boo:Hoo>
Please note the use of two Namespaces (Boo,Yoo).
c.
The format of the String A in object Foo is "xxx-xxx-xxx", where x can be any alphanumeric character.
With in your transformation modify the format to "(xxx) xxx.xxx". Please note that the character " is only used to mark the start and end of the String.
Первое сделал, с массивом пришлось немножко помудрить, но получилось все.
Чего от меня хотят во втором, не очень понял - unmarshal xml and transform it в то, что показано? Что имеется в виду под этой строкой: "This is the boo-hoo-yoo response string for mysite.com" - откуда ее брать?
Или они хотять чтобы я сделал это с помощью XSLT?
И третье тоже интересно - делать это в джаве или с помощью XSLT?
Спасибо за помощь заранее!
a. Using JAXB or another XML binding framework marshal the object below into XML.
Foo
String[] A;
int B;
b. Transform the XML generated by the binding framework for object Foo into
<?xml version="1.0"?>
<Boo:Hoo xmlns:Boo ="http://www.mysite.com/schema/Boo">
<Boo:A># VALUE OF A#</Boo:A>
…..
<Boo:A># VALUE OF A#</Boo:A>
<Yoo:B xmlns:Yoo ="http://www.mysite.com/schema/Yoo" B=”# VALUE OF B#”/>
<![CDATA[
This is the boo-hoo-yoo response string for mysite.com
]]>
</Boo:Hoo>
Please note the use of two Namespaces (Boo,Yoo).
c.
The format of the String A in object Foo is "xxx-xxx-xxx", where x can be any alphanumeric character.
With in your transformation modify the format to "(xxx) xxx.xxx". Please note that the character " is only used to mark the start and end of the String.
Первое сделал, с массивом пришлось немножко помудрить, но получилось все.
Чего от меня хотят во втором, не очень понял - unmarshal xml and transform it в то, что показано? Что имеется в виду под этой строкой: "This is the boo-hoo-yoo response string for mysite.com" - откуда ее брать?
Или они хотять чтобы я сделал это с помощью XSLT?
И третье тоже интересно - делать это в джаве или с помощью XSLT?
Спасибо за помощь заранее!
-
- Уже с Приветом
- Posts: 1071
- Joined: 18 Nov 2003 22:53
- Location: MA
Неужели никто не знает, только флейм поддерживаете?
вот код XML схемы для первого задания:
могу джава код привести, который в-из XML читает, если нужно ...
вот код XML схемы для первого задания:
Code: Select all
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
jxb:version="1.0">
<xsd:element name="Foo" type="FooType"/>
<xsd:complexType name="FooType">
<xsd:sequence>
<xsd:element name="A" type="xsd:string" maxOccurs="unbounded">
<xsd:annotation>
<xsd:appinfo>
<jxb:property name = "A" collectionType = "indexed" />
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="B" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
могу джава код привести, который в-из XML читает, если нужно ...
-
- Уже с Приветом
- Posts: 1243
- Joined: 09 Sep 2003 18:31
Вопросы сформулированы очень неудачно.
Неочевидно, что на вопрос "marshal the object below into XML" ожидают XML Schema. Скорее уж две строчки кода (типа marshaller.marshal(foo, System.out); ) с пояснением, что schema и Java interfaces/impl classes generated before.
Второй вопрос, ИМХО, продолжение первого. Т.е. результат сериализации из первозо вопроса надо трансформировать в требуемый. Наверное, надо привести и XSLT и Java code, который performs transformation.
Третий вопрос - скорее всего XSLT будет достаточно.
[/b]
Неочевидно, что на вопрос "marshal the object below into XML" ожидают XML Schema. Скорее уж две строчки кода (типа marshaller.marshal(foo, System.out); ) с пояснением, что schema и Java interfaces/impl classes generated before.
Второй вопрос, ИМХО, продолжение первого. Т.е. результат сериализации из первозо вопроса надо трансформировать в требуемый. Наверное, надо привести и XSLT и Java code, который performs transformation.
Третий вопрос - скорее всего XSLT будет достаточно.
[/b]
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
Re: XML binding etc.
testuser wrote:a. Using JAXB or another XML binding framework marshal the object below into XML.
Foo
String[] A;
int B;
....
Первое сделал, с массивом пришлось немножко помудрить, но получилось все.
А не проверите мое решение для N1?
Code: Select all
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.JAXBContext;
public class CreateFooXML {
public static void main(String args[]) {
try {
JAXBContext jc = JAXBContext.newInstance( "foo" );
Foo foo = new Foo(string1,string2,string3,3);
// -- instantiate Marshaller
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
// -- marshal the foo object out as a <foo>
FileWriter file = new FileWriter("foo.xml");
m.marshal(foo, file);
file.close();
}
catch( JAXBException je )
{
je.printStackTrace();
}
}
}
Спасибо,
Сабина
-
- Уже с Приветом
- Posts: 1243
- Joined: 09 Sep 2003 18:31
Re: XML binding etc.
Sabina wrote:А не проверите мое решение для N1?Code: Select all
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.JAXBContext;
public class CreateFooXML {
--> public static final OBJECT_FACTORY = new ObjectFactory();
public static void main(String args[]) {
try {
JAXBContext jc = JAXBContext.newInstance( "foo" );
--> Foo foo = OBJECT_FACTORY.createFoo();
--> foo.setA(new String[] {"Hello", "JAXB"});
--> foo.setB(100);
// -- instantiate Marshaller
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
// -- marshal the foo object out as a <foo>
FileWriter file = new FileWriter("foo.xml");
m.marshal(foo, file);
file.close();
}
catch( JAXBException je ) {
je.printStackTrace();
}
}
}
-
- Уже с Приветом
- Posts: 1071
- Joined: 18 Nov 2003 22:53
- Location: MA
-
- Уже с Приветом
- Posts: 1071
- Joined: 18 Nov 2003 22:53
- Location: MA
Re: XML binding etc.
Foo is an interface, so you can't instantiate it.
othervise it looks like it.
othervise it looks like it.
Code: Select all
public class Main {
public static void main( String[] args ) {
try {
// create a JAXBContext
JAXBContext jc = JAXBContext.newInstance( "jaxp" );
ObjectFactory objFactory = new ObjectFactory();
Foo foo = objFactory.createFoo();
String[] strings = {"string 111", "string 222", "string 333"};
foo.setA(strings);
foo.setB(1234);
// create a Marshaller and marshal to System.out
Marshaller m = jc.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
m.marshal( foo, System.out );
} catch( JAXBException je ) {
je.printStackTrace();
}
}
}
-
- Уже с Приветом
- Posts: 1071
- Joined: 18 Nov 2003 22:53
- Location: MA
OO8 wrote:Вопросы сформулированы очень неудачно.
Неочевидно, что на вопрос "marshal the object below into XML" ожидают XML Schema. Скорее уж две строчки кода (типа marshaller.marshal(foo, System.out); ) с пояснением, что schema и Java interfaces/impl classes generated before.
Второй вопрос, ИМХО, продолжение первого. Т.е. результат сериализации из первозо вопроса надо трансформировать в требуемый. Наверное, надо привести и XSLT и Java code, который performs transformation.
Третий вопрос - скорее всего XSLT будет достаточно.
[/b]
Ну я поэтому и спрашиваю, что непонятно, что нужно делать.
Ну да, для того чтобы сгенерировать классы нужно сделать схему ...
Да, второй звучит как продолжение, вот я и думаю как это сделать.
В примерах к Web Services Developer Pack 1.3 вот тут:
http://java.sun.com/webservices/docs/1. ... index.html
есть одна программа,
samples/namespace-prefix
This sample application demonstrates how to use the new JAXB RI Marshaller property "com.sun.xml.bind.namespacePrefixMapper" to customize the namespace prefixes generated during marshalling.
Я думаю, это то или нет.
Там реализованы такие методы в NamespacePrefixMapperImpl.java :
Code: Select all
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
// I want this namespace to be mapped to "xsi"
if( "http://www.w3.org/2001/XMLSchema-instance".equals(namespaceUri) )
return "xsi";
// I want the namespace foo to be the default namespace.
if( "http://www.example.com/foo".equals(namespaceUri) )
return "";
// and the namespace bar will use "b".
if( "http://www.example.com/bar".equals(namespaceUri) )
return "b";
// otherwise I don't care. Just use the default suggestion, whatever it may be.
return suggestion;
}
и
Code: Select all
public String[] getPreDeclaredNamespaceUris() {
return new String[] { "urn:abc", "urn:def" };
}
а потом в главной программе мы делаем вот что:
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",new NamespacePrefixMapperImpl());
Это то что мне нужно или нужно что-то другое?
Да, и что они имеют в виду под
Code: Select all
<![CDATA[
This is the boo-hoo-yoo response string for register.com
]]>
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
Re: XML binding etc.
OO8 wrote:--> public static final OBJECT_FACTORY = new ObjectFactory();
....
--> Foo foo = OBJECT_FACTORY.createFoo();
--> foo.setA(new String[] {"Hello", "JAXB"});
--> foo.setB(100);
То есть мы считаем что Foo() сам по себе schema-derived, потому и interface...
Сабина
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
testuser wrote:Да, второй звучит как продолжение, вот я и думаю как это сделать.
В примерах к Web Services Developer Pack 1.3 вот тут:
http://java.sun.com/webservices/docs/1. ... index.html
есть одна программа,
samples/namespace-prefix
А может они просто хотят банальный XSLT? Тогда и CDATA как бы при чем...
А с двумя namespaces можно поступить таким образом:
You can also assign result tree elements and attributes to specific namespaces by adding a namespace attribute to the xsl:element instruction or to an xsl:attribute instruction. For example, the second xsl:element instruction in the following template and the two xsl:attribute elements inside of the first xsl:element each include a namespace attribute along with their name attributes. These identify the two namespaces where the element and attribute names belong: the HTML and XLink namespaces.
<!-- xq246.xsl: converts xq237.xml into xq247.xml -->
<xsl:template match="xdata">
<section>
<xsl:element name="author">
<xsl:attribute namespace="http://www.w3.org/1999/xlink"
name="type" >simple</xsl:attribute>
<xsl:attribute namespace="http://www.w3.org/1999/xlink"
name="href" >jmilton.html</xsl:attribute>
John Milton
</xsl:element>
<xsl:element name="img"
namespace="http://www.w3.org/TR/REC-html40">
<xsl:attribute name="src">milton.jpg</xsl:attribute>
</xsl:element>
<xsl:apply-templates/>
</section>
</xsl:template>
When applied to the same source document as the earlier examples, this stylesheet creates a result document that has an author element with two attributes from the XLink namespace and an img element from the HTML namespace. The XSLT processor can make up any namespace prefixes it wants; in this case, they're "ns0" and "ns1".
Сабина
-
- Уже с Приветом
- Posts: 1071
- Joined: 18 Nov 2003 22:53
- Location: MA
Re: XML binding etc.
Sabina wrote:OO8 wrote:--> public static final OBJECT_FACTORY = new ObjectFactory();
....
--> Foo foo = OBJECT_FACTORY.createFoo();
--> foo.setA(new String[] {"Hello", "JAXB"});
--> foo.setB(100);
То есть мы считаем что Foo() сам по себе schema-derived, потому и interface...
Сабина
Ну да, а иначе не получится ... Точнее можно наверное сделать нужные классы самому, но выгоды никакой от этого не будет - тогда проще уж самостоятельно распарсить XML в джавовские объекты или сериализовать их в XML.
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 1071
- Joined: 18 Nov 2003 22:53
- Location: MA
-
- Уже с Приветом
- Posts: 1243
- Joined: 09 Sep 2003 18:31
testuser wrote:Ну я поэтому и спрашиваю, что непонятно, что нужно делать.
А уточнить нельзя? И еще эти вопросы только об XML Binding или о разных XML-related технологиях?
Если первое, то надо менять XML Schema for Foo. Обратите внимание, что значение int B во втором вопросе представлено как атрибут элемента Yoo:B.
Т.е. надо придумать другую схему и возможно использовать namespacePrefixMapper.
Если второе, то я бы использовал XSLT. Там можно что угодно поменять, в т.ч. включить nonsense в CDATA.
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA
-
- Уже с Приветом
- Posts: 1071
- Joined: 18 Nov 2003 22:53
- Location: MA
Решил не уточнять.
Если кому интересно, вот мои результаты(схема, с помощью которой я трансформировал):
а вот джавовский код, который это все делал:
Такие вот дела, отослал, будем ждать теперь ответа [/img]
Если кому интересно, вот мои результаты(схема, с помощью которой я трансформировал):
Code: Select all
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:Boo="www.register.com/schema/Boo"
xmlns:Yoo="www.register.com/schema/Yoo">
<!-- XML output! -->
<xsl:output method="xml" indent="yes" cdata-section-elements="Boo:Hoo"/>
<xsl:template match="text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
<xsl:template match="/">
<Boo:Hoo>
<xsl:apply-templates/>
This is the boo-hoo-yoo response string for .com
</Boo:Hoo>
</xsl:template>
<xsl:template match="/Foo/A">
<Boo:A>
<xsl:value-of select="concat('(',
substring-before(., '-'),
')',
translate(substring-after(.,'-'), '-', '.'))"/>
</Boo:A>
</xsl:template>
<xsl:template match="/Foo/B">
<Yoo:B>B=<xsl:apply-templates/> </Yoo:B>
</xsl:template>
</xsl:stylesheet>
а вот джавовский код, который это все делал:
Code: Select all
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import jaxp.*;
public class Main {
// Global value so it can be ref'd by the tree-adapter
static Document document;
public static void main( String[] args ) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
// create a JAXBContext
JAXBContext jc = JAXBContext.newInstance( "jaxp" );
ObjectFactory objFactory = new ObjectFactory();
Foo foo = objFactory.createFoo();
String[] strings = {"111-222-333", "444-555-666", "777-888-999"};
foo.setA(strings);
foo.setB(1234);
// create a Marshaller and marshal to myFoo.xml
Marshaller m = jc.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
m.marshal( foo, new FileOutputStream("myFoo.xml"));
File stylesheet = new File("foo_transform.xsl");
File datafile = new File("myFoo.xml");
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(datafile);
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = tFactory.newTransformer(stylesource);
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new FileOutputStream("myTransformedFoo.xml"));
transformer.transform(source, result);
} catch( JAXBException je ) {
je.printStackTrace();
}
catch(Exception e){
e.printStackTrace(System.out);
}
}
}
Такие вот дела, отослал, будем ждать теперь ответа [/img]
-
- Уже с Приветом
- Posts: 5669
- Joined: 13 Oct 2000 09:01
- Location: East Bay, CA