Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / XML access using DOM / 24 сообщений из 24, страница 1 из 1
23.05.2006, 11:55
    #33744777
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Господа!

Возникла необходимость работы с XML документами, нужны следующие основные операции:

1. Получить значение элемента с определенным именем
2. Получить часть документа, которая входит в элемент с определенным именем.

Поясню на примерах.

Случай №1. Документ:

<xml>
<mynode>value</mynode>
<othernode><child>data</child></othernode>
</xml>

Нужно уметь говорить: getElemValue("mynode") - вернет "value", или getElemValue("child") - вернет "data"

Случай №2. Документ:

<xml>
<mynode>value</mynode>
<othernode><child>data</child></othernode>
</xml>

Нужно уметь говорить: getPartContaining("othernode") - должен вернуть "<othernode><child>data</child></othernode>"

Возможно ли реализовать это с помощью DOM? Я так понял сходу что (1) точно можно, а как насчет (2)? Во втором случае функция должна отдавать именно кусок XML документа.
...
Рейтинг: 0 / 0
23.05.2006, 12:03
    #33744820
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
XPath спасет
...
Рейтинг: 0 / 0
23.05.2006, 12:04
    #33744824
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
1. да
2. да

ps. вы путаете DOM (Document Object Model ) и представление документа
...
Рейтинг: 0 / 0
23.05.2006, 12:25
    #33744930
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
1. Библиотеку для XPath подскажите плиз

2. Document Object Model и "представление документа" в чем по вашему разница, буквально пара слов
...
Рейтинг: 0 / 0
23.05.2006, 12:53
    #33745096
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
класс XPathAPI, искать в Xalan
в пятой жабе вроде бы стал частью SDK
...
Рейтинг: 0 / 0
23.05.2006, 13:02
    #33745144
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Xalan нет, есть Jaxen, он нормальный?
...
Рейтинг: 0 / 0
23.05.2006, 13:13
    #33745194
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
токашо посмотрел - есть в rt.jat от jdk1.4
наверное, оно
...
Рейтинг: 0 / 0
23.05.2006, 13:20
    #33745230
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Да нашел спасибо.

Можно я еще тупые вопросы позадаю?

Как я понял из javadoc http://xml.apache.org/xalan-j/apidocs/org/apache/xpath/XPathAPI.html, этот класс берет документ разобранный с помощью DOM, и выдергивает из него такие элементы, которые соответствуют выражению XPath.

Я прав?

Т.е. этот API работает совсместно с DOM?
...
Рейтинг: 0 / 0
23.05.2006, 13:22
    #33745239
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
cooluserЯ прав?

Да, можно строить запросы к документу по абсолютному/относительному пути, выбирать списки узлов по параметрам, получать значения текстовых элементов.
...
Рейтинг: 0 / 0
23.05.2006, 13:27
    #33745264
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
И еще вопрос. Насколько я понял node.getNodeValue() для текстовых узлов должен возвращать тот текст, который находитя внутри элемента.

Ну то есть для <elem>data</elem> д.б. "data". У меня стабильно возвращается пустая строка (не null). В чем я могу быть не прав???
...
Рейтинг: 0 / 0
23.05.2006, 13:42
    #33745347
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
cooluserИ еще вопрос. Насколько я понял node.getNodeValue() для текстовых узлов должен возвращать тот текст, который находитя внутри элемента.

Ну то есть для <elem>data</elem> д.б. "data". У меня стабильно возвращается пустая строка (не null). В чем я могу быть не прав???

тут интересный прикол:
у нода elem нет текстового значения, оно есть у его child-нода
т.е. data - сам по себе текстовый нод

надо что-то вроде node.getChildNodes()[0].getNodeValue()

XPath как раз помогает избежать такого монстрообразного кода
...
Рейтинг: 0 / 0
23.05.2006, 13:59
    #33745444
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Каким образом? Я же в итоге XPath запросом получаю все равно коллекцию нод
...
Рейтинг: 0 / 0
23.05.2006, 14:00
    #33745451
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
А за прикол про "текстовый нод сам себе нод" - спасибо, долго над этим бился :) Самое интересное что с точки зрения XML это же вроде не нод получается.
...
Рейтинг: 0 / 0
23.05.2006, 14:06
    #33745477
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
И все таки, и при использовании XPath и при использовании DOM не вижу решения первоначальной задачи: "Написать такой запрос, который вернет часть XML документа". Т.е. нужен не набор нод, а именно кусок XML документа.

Например:
<xml>
<node>
<child><data>mydata</data>
</child>
</xml>

Говорю: дай ту часть документа ,которая содержится в тэге <child>, возвращает - <child><data>mydata</data>
...
Рейтинг: 0 / 0
23.05.2006, 15:03
    #33745783
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
cooluserГоворю: дай ту часть документа ,которая содержится в тэге <child>, возвращает - <child><data>mydata</data>

а надо что?
...
Рейтинг: 0 / 0
23.05.2006, 15:16
    #33745832
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Еще раз.

Есть документ:
<xml>
<node>
<child><data>mydata</data>
</child>
</xml>

Цель. Получить часть документа заключенную между открывающем и закрывающем тэгом, например между открывающем и закрывающем тегами <child>

Результат для этого случая должен быть таким: <child><data>mydata</data>
</child>
...
Рейтинг: 0 / 0
23.05.2006, 15:41
    #33745958
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
налетсо взаимное недопонимание.


нода - это и есть кусок документа.
XPath вернет все ноды, соответствующие запросу
если нода там такая одна - вернет одну (логично :))
...
Рейтинг: 0 / 0
23.05.2006, 17:27
    #33746432
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Ну ясно.

Т.е. он вернет именно ноду в виде некоторой структуры данных в рамках Java.

В моей задаче XML надо рассматривать в данном случае как текст, и я хочу полчать ноду не в виде структуры данных, и в виде plain text, который являются также XML документом. Я об этом писал в сообщении 2696638.

В принципе это можно регекспом делать, но интересно можно ли с помощью DOM,SAX,XPath итд?
...
Рейтинг: 0 / 0
23.05.2006, 17:32
    #33746455
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
cooluserНу ясно.

Т.е. он вернет именно ноду в виде некоторой структуры данных в рамках Java.

В моей задаче XML надо рассматривать в данном случае как текст, и я хочу полчать ноду не в виде структуры данных, и в виде plain text, который являются также XML документом. Я об этом писал в сообщении 2696638.

В принципе это можно регекспом делать, но интересно можно ли с помощью DOM,SAX,XPath итд?

DOM для этого отлично подходит.

велл-формед XML это дерево из узлов.
Node - это интерфейс для представления узла дерева.
т.е. надо получить Node (суть фрагмент XML), и после сериализовать его в текст.

Ключевые слова для поиска: DOMWriter, DOM serialization

В общем, если ничего не поможет - пиши в форум, как приду домой - накидаю пример :)
...
Рейтинг: 0 / 0
23.05.2006, 18:48
    #33746644
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Ага, кажется уже начинаю понимать! Respect!!!

Я, наверное, тебе уже порядок надоело, но если не трудно кинь всё таки пример :)

Чё та тяжело у меня все эти XML технологии идут...
...
Рейтинг: 0 / 0
23.05.2006, 22:55
    #33746946
Pitbull terrier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
 import  java.io.IOException;
 import  java.io.PrintStream;
 import  java.io.StringReader;

 import  javax.xml.parsers.DocumentBuilderFactory;
 import  javax.xml.parsers.ParserConfigurationException;
 import  javax.xml.transform.TransformerException;

 import  org.w3c.dom.Attr;
 import  org.w3c.dom.Document;
 import  org.w3c.dom.NamedNodeMap;
 import  org.w3c.dom.Node;
 import  org.w3c.dom.NodeList;
 import  org.xml.sax.InputSource;
 import  org.xml.sax.SAXException;

 import  com.sun.org.apache.xpath.internal.XPathAPI;

 public   class  XPathTest
{
	 public   static   void  main(String[] args)  throws  SAXException, IOException,
			ParserConfigurationException, TransformerException
	{
		String xml = "<xml><mynode>value</mynode><othernode><child>data</child></othernode></xml>";
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setValidating(false);
		Document document = factory.newDocumentBuilder().parse(
				 new  InputSource( new  StringReader(xml)));
		String xpathExp = "/xml/othernode";
		NodeList list = XPathAPI.selectNodeList(document, xpathExp);
		print(list.item( 0 ), System.out);
	}

	 static   void  print(Node node, PrintStream out)
	{
		 int  type = node.getNodeType();
		 switch  (type)
		{
			 case  Node.ELEMENT_NODE:
				out.print("<" + node.getNodeName());
				NamedNodeMap attrs = node.getAttributes();
				 int  len = attrs.getLength();
				 for  ( int  i =  0 ; i < len; i++)
				{
					Attr attr = (Attr) attrs.item(i);
					out.print(" " + attr.getNodeName() + "=\""
							+ escapeXML(attr.getNodeValue()) + "\"");
				}
				out.print('>');
				NodeList children = node.getChildNodes();
				len = children.getLength();
				 for  ( int  i =  0 ; i < len; i++)
					print(children.item(i), out);
				out.print("</" + node.getNodeName() + ">");
				 break ;
			 case  Node.ENTITY_REFERENCE_NODE:
				out.print("&" + node.getNodeName() + ";");
				 break ;
			 case  Node.CDATA_SECTION_NODE:
				out.print("<![CDATA[" + node.getNodeValue() + "]]>");
				 break ;
			 case  Node.TEXT_NODE:
				out.print(escapeXML(node.getNodeValue()));
				 break ;
			 case  Node.PROCESSING_INSTRUCTION_NODE:
				out.print("<?" + node.getNodeName());
				String data = node.getNodeValue();
				 if  (data !=  null  && data.length() >  0 )
					out.print(" " + data);
				out.println("?>");
				 break ;
		}
	}

	 static  String escapeXML(String s)
	{
		StringBuffer str =  new  StringBuffer();
		 int  len = (s !=  null ) ? s.length() :  0 ;
		 for  ( int  i =  0 ; i < len; i++)
		{
			 char  ch = s.charAt(i);
			 switch  (ch)
			{
				 case  '<':
					str.append("<");
					 break ;
				 case  '>':
					str.append(">");
					 break ;
				 case  '&':
					str.append("&");
					 break ;
				 case  '"':
					str.append(""");
					break;
				case '\'':
					str.append("'");
					 break ;
				 default :
					str.append(ch);
			}
		}
		 return  str.toString();
	}
}
...
Рейтинг: 0 / 0
24.05.2006, 06:34
    #33747116
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Спасибо, интересно получается.

А что если использовать встроенные в DOM средства сериализации? например вот так можно:

String xml = "<xml><mynode>value</mynode><othernode><child>data</child></othernode></xml>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
Document document = factory.newDocumentBuilder().parse(
new InputSource(new StringReader(xml)));
String xpathExp = "/xml/othernode";
NodeList list = XPathAPI.selectNodeList(document, xpathExp);
XMLSerializer xmlSer = new XMLSerializer();
xmlSer.setOutputByteStream(System.out);
xmlSer.serialize((Element)list.item(0));


Только в этом случае цепляется стандартный заголовок "<?xml version="1.0"?>", мне он не нужен, как то отключить интересно можно?
...
Рейтинг: 0 / 0
24.05.2006, 06:41
    #33747121
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Разобрался, можно вот таким образом:

OutputFormat format = new OutputFormat(document);
format.setOmitXMLDeclaration(true); // отключает заголовок XML
XMLSerializer xmlSer = new XMLSerializer(System.out,format);
xmlSer.serialize((Element)list.item(0));
...
Рейтинг: 0 / 0
24.05.2006, 09:14
    #33747300
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML access using DOM
Да, и самый главный вопрос, как к DOM парсеру прикрутить валидацию поXML Schema (не DTD)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / XML access using DOM / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]