Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как создать вложеный тэг? XML 
:(
    Опции темы
#Maestro#
Дата 7.5.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.7.2008

Репутация: нет
Всего: нет



народ помогите создать вложеный тэг? XML-файл имеет примерно такой вид:

Код

- <TableName>
  <TAG1>Val11 Val21</TAG1> 
  <TAG2>Val12 Val22</TAG2> 
  </TableName>


вот функция создаёт этого XML-файл:
Код

 public void write(List<String> collNames, List<String> collValues)
      {

         File f = new File("workbook.xml");

        try
        {

        builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.newDocument();

        // Prepare the DOM document for writing
        Source source = new DOMSource(doc);

        // Prepare the output file
            Result result = new StreamResult(f);

        Element root = doc.createElement(collNames.get(0));

         root.setTextContent(collNames.get(0));

         Element rt = (Element) doc.createElement("TableName");

            for(String i:collNames)
            {
            Element root1 = doc.createElement(i);

          for(int j=0; j<collNames.size();j++)

                {
                 root1.appendChild( doc.createTextNode(collValues.get(j)) );
                 root1.appendChild( doc.createTextNode(" "));
                }

        rt.appendChild( doc.adoptNode(root1) );
            }

        doc.appendChild(rt);

    // Write the DOM document to the file
    Transformer xformer = TransformerFactory.newInstance().newTransformer();
    xformer.transform(source, result);
        }
          catch (Exception e) {System.out.println(e.toString());}

    }


    где 
Код
collNames = Arrays.asList("TAG1", "TAG2");
           collValues = Arrays.asList("Val11", "Val12","Val21", "Val22"); //по-моему ничего не перепутал


cледует, что бы XML выглядел

Код

- <TableName>
     <TAG1>
    <1> Val11 </1>
    <2> Val21 </2>
    </TAG1> 
    <TAG2>
    <1> Val12 </1>
    <2> Val22 </2> 
   </TAG2> 
  </TableName>


Это сообщение отредактировал(а) #Maestro# - 7.5.2009, 15:27
PM MAIL   Вверх
Fieral
Дата 7.5.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



нельзя писать номера в началах имен тегов
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
#Maestro#
Дата 8.5.2009, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.7.2008

Репутация: нет
Всего: нет



хорошо, пуcть XML-файл на выходе будет таким:

Код

<TableName>
     <TAG1>
    <mytag1> Val11 </mytag1>
    <mytag2> Val21 </mytag2>
    </TAG1> 
    <TAG2>
    <mytag1> Val12 </mytag1>
    <mytag2> Val22 </mytag2> 
   </TAG2> 
  </TableName>


надеюсь, так можно?

Это сообщение отредактировал(а) #Maestro# - 8.5.2009, 09:11
PM MAIL   Вверх
Fieral
Дата 8.5.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



-----------

Добавлено через 3 минуты и 20 секунд
а более глобально задача как стоит?

вообще можно сделать структуру типа дерево:

Код

package rebecca.e.util.printer;

import rebecca.e.util.Map;
import rebecca.e.util.MapArray;
import rebecca.e.util.Printable;
import rebecca.e.util.Set;
import rebecca.e.util.SetArray;

public class Node implements Printable {

    String n;
    String t = "";

    public String getText() {
        return t;
    }

    public void setText(String t) {
        this.t = t;
    }

    public Node(String name) {
        n = name;
    }

    public String getName() {
        return n;
    }

    private Map<String, String> Attributes = new MapArray<String, String>();

    private Set<Node> SubNodes = new SetArray<Node>();

    public Map<String, String> getAttributes() {
        return Attributes;
    }

    public Set<Node> getSubNodes() {
        return SubNodes;
    }

    void printAtr(String p, int i) {
        String F = p + "<A> (" + this.Attributes.getKey(i) + ") = [";
        System.out.println(F
                + this.Attributes.get(i).replaceAll("\n",
                        "\n" + s(F.length()) + "|") + "]");
    }

    void printSubNode(String p, int i) {
        this.SubNodes.get(i).print0(p);
    }

    @Override
    public void print() {
        this.print0(" ");
        // TODO Auto-generated method stub

    }

    String s(int k) {
        char c = ' ';
        char[] C = new char[k];
        for (int i = 0; i < k; i++) {
            C[i] = c;
        }
        return String.copyValueOf(C);
    }

    void print0(String p) {
        
        if (this.SubNodes.size() == 0) {
            String F = p + "<N> (" + this.n + ") = [";
            String tt = this.getText();
            if (tt.length() > 1000) {
                tt = tt.substring(0, 1000)+"................";
            }
            System.out.println(F
                    + tt.replaceAll("\n", "\n" + s(F.length()) + "|") + "]");
        } else {
            System.out.println(p + "  " + "<N> (" + this.n + ")");
        }

        for (int i = 0; i < this.Attributes.size(); i++) {
            printAtr(p + "            ", i);
        }

        for (int i = 0; i < this.SubNodes.size(); i++) {
            printSubNode(p + "      ", i);
        }

    }
}



построить нужное дерево и оттранслировать его методом node2XmlString

Код

package rebecca.e.util.printer;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;

public class NodeXML {

    public String node2XmlString(Node n) throws SAXException,
            TransformerConfigurationException {
        // PrintWriter from a Servlet
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        StreamResult streamResult = new StreamResult(out);
        SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory
                .newInstance();
        // SAX2.0 ContentHandler.
        TransformerHandler hd = tf.newTransformerHandler();
        Transformer serializer = hd.getTransformer();
        serializer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
        // serializer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "fake.dtd");
        serializer.setOutputProperty(OutputKeys.INDENT, "yes");
        hd.setResult(streamResult);
        hd.startDocument();
        resurect(hd, n);
        hd.endDocument();

        return out.toString();
    }

    private void resurect(TransformerHandler hd, Node n) throws SAXException {
        // TODO Auto-generated method stub

        AttributesImpl atts = new AttributesImpl();

        for (int i = 0; i < n.getAttributes().size(); i++) {
            atts.addAttribute("", "", n.getAttributes().getKey(i), "", n
                    .getAttributes().get(i));
        }
        // USERS tag.

        hd.startElement("", "", n.getName(), atts);
        hd.characters(n.getText().toCharArray(), 0,
                n.getText().toCharArray().length);
        // USER tags.

        for (int i = 0; i < n.getSubNodes().size(); i++) {
            resurect(hd, n.getSubNodes().get(i));
        }

        hd.endElement("", "", n.getName());

    }

    public Node xmlString2Node(String data, boolean b)
            throws ParserConfigurationException, SAXException, IOException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

        MyHandler handler = new MyHandler(b);

        ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes());

        saxParser.parse(is, handler);
        // .parse(r, handler);

        Node N = handler.getOne();
        clear(N);

        return N;

    }

    private void clear(Node n) {
        // TODO Auto-generated method stub
        if (n.getSubNodes().size() == 0) {

        } else {
            n.setText("");
            for (int i = 0; i < n.getSubNodes().size(); i++) {
                clear(n.getSubNodes().get(i));
            }
        }

    }

    public Node xmlFile2Node(String FilePh, boolean b)
            throws ParserConfigurationException, SAXException, IOException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

        MyHandler handler = new MyHandler(b);

        File f = new File(FilePh);

        saxParser.parse(f, handler);
        // .parse(r, handler);

        return handler.getOne();

    }

    // public Node xmlString2Node(String r, boolean b) throws
    // ParserConfigurationException, SAXException, IOException {
    // // TODO Auto-generated method stub
    // File file = new File(r);
    // DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    // DocumentBuilder db = dbf.newDocumentBuilder();
    // Document doc = db.parse(file);
    // doc.getDocumentElement().normalize();
    //
    // Element rt = doc.getDocumentElement();
    //
    // if (b)
    // System.out.println("Root element " + rt.getNodeName());
    // return xmlunpack(rt);
    // }

    private Node xmlunpack(Element rt) {
        // TODO Auto-generated method stub
        Node n = new Node(rt.getNodeName());

        NamedNodeMap a = rt.getAttributes();

        for (int i = 0; i < a.getLength(); i++) {
            n.getAttributes().put(a.item(i).getNodeName(),
                    a.item(i).getNodeValue());
        }

        NodeList nodeLst = rt.getChildNodes();

        for (int s = 0; s < nodeLst.getLength(); s++) {

            org.w3c.dom.Node fstNode = nodeLst.item(s);

            if (fstNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {

                Element fstElmnt = (Element) fstNode;
                Node v = xmlunpack(fstElmnt);
                n.getSubNodes().add(v);

            }

        }
        return n;
    }
}

class MyHandler extends DefaultHandler {
    Vector<Node> n = new Vector<Node>();
    boolean f = true;
    boolean d;
    Node root;

    public MyHandler(boolean b) {
        super();
        d = b;

    }

    public void characters(char ch[], int start, int length)
            throws SAXException {
        // hd.characters(desc[i].toCharArray(),0,desc[i].length());

        char[] x = new char[length];
        for (int i = 0; i < length; i++) {
            x[i] = ch[start + i];

        }
        //
        // this.n.get(0).setText(t);
        // System.out.println(">>> [" + String.valueOf(x) + "] : " + x.length);
        this.n.get(0).setText(this.n.get(0).getText() + String.valueOf(x));
    }

    public Node getOne() {
        // TODO Auto-generated method stub
        return root;
    }

    public void put(Node root) {
        n.insertElementAt(root, 0);
    }

    public void startElement(String uri, String localName, String qName,
            org.xml.sax.Attributes attributes) throws SAXException {

        if (d) {
            System.out.println("<" + qName + ">");
        }
        Node N = new Node(qName);

        if (f) {
            root = N;
            f = false;
        } else {
            this.n.get(0).getSubNodes().add(N);
        }

        for (int i = 0; i < attributes.getLength(); i++) {

            if (d) {
                String s = attributes.getValue(i);
                if (s.length() > 80) {
                    s = s.substring(0, 80);
                    System.out
                            .println(attributes.getQName(i) + ":" + s + "...");
                } else {
                    System.out.println(attributes.getQName(i) + ":" + s);
                }

            }

            N.getAttributes().put(attributes.getQName(i),
                    attributes.getValue(i));
        }

        this.n.insertElementAt(N, 0);
        // if (qName.equalsIgnoreCase("dir") || qName.equalsIgnoreCase("file"))
        // {}
    }

    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        if (d) {
            System.out.println("</" + qName + ">");
        }
        this.n.remove(0);
        // if (qName.equalsIgnoreCase("dir") || qName.equalsIgnoreCase("file"))
        // {}
    }

};



Это сообщение отредактировал(а) Fieral - 8.5.2009, 13:05
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.