XML binding etc.

testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

XML binding etc.

Post by testuser »

Мне для интервью нужно задачку решить ...

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?

Спасибо за помощь заранее!
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

Неужели никто не знает, только флейм поддерживаете? :)

вот код 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 читает, если нужно ...
User avatar
OO8
Уже с Приветом
Posts: 1243
Joined: 09 Sep 2003 18:31

Post by OO8 »

Вопросы сформулированы очень неудачно.

Неочевидно, что на вопрос "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]
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: XML binding etc.

Post by Sabina »

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();
            }
      }
}


Спасибо,
Сабина
User avatar
OO8
Уже с Приветом
Posts: 1243
Joined: 09 Sep 2003 18:31

Re: XML binding etc.

Post by OO8 »

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();
      }
   }
}

testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Re: XML binding etc.

Post by testuser »

ups..
Last edited by testuser on 19 Mar 2004 20:38, edited 1 time in total.
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Re: XML binding etc.

Post by testuser »

Foo is an interface, so you can't instantiate 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();
        }
}
   
}
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

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
   ]]>
- откуда этот респонс должен идти?
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: XML binding etc.

Post by Sabina »

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...

Сабина
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

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".


Сабина
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Re: XML binding etc.

Post by testuser »

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.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

Sabina wrote:А может они просто хотят банальный XSLT? Тогда и CDATA как бы при чем...


И тогда вроде вопрос 3 makes sense, потому что он начинается с "within your transformation"....

Сабина
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

Sabina wrote:
Sabina wrote:А может они просто хотят банальный XSLT? Тогда и CDATA как бы при чем...


И тогда вроде вопрос 3 makes sense, потому что он начинается с "within your transformation"....

Сабина


буду в этом направлении работать ...
User avatar
OO8
Уже с Приветом
Posts: 1243
Joined: 09 Sep 2003 18:31

Post by OO8 »

testuser wrote:Ну я поэтому и спрашиваю, что непонятно, что нужно делать.


А уточнить нельзя? И еще эти вопросы только об XML Binding или о разных XML-related технологиях?

Если первое, то надо менять XML Schema for Foo. Обратите внимание, что значение int B во втором вопросе представлено как атрибут элемента Yoo:B.
Т.е. надо придумать другую схему и возможно использовать namespacePrefixMapper.

Если второе, то я бы использовал XSLT. Там можно что угодно поменять, в т.ч. включить nonsense в CDATA.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

OO8 wrote:А уточнить нельзя? И еще эти вопросы только об XML Binding или о разных XML-related технологиях?


А еще лучше заготовить оба ответа и если не удасться уточнить, то сказать "если это, то можно так, а если то, то можно эдак." :)

Сабина
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

Решил не уточнять.

Если кому интересно, вот мои результаты(схема, с помощью которой я трансформировал):

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]
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

testuser wrote:Такие вот дела, отослал, будем ждать теперь ответа :)


Удачи!!!

А какая позиция, если не секрет? Не конкретно фирма, а просто job description интересует.

Спасибо,
Сабина

Return to “Вопросы и новости IT”