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

Возникла необходимость работы с 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
XML access using DOM
    #33744820
Фотография Pitbull terrier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XPath спасет
...
Рейтинг: 0 / 0
XML access using DOM
    #33744824
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. да
2. да

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

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

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

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

Я прав?

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

Чё та тяжело у меня все эти XML технологии идут...
...
Рейтинг: 0 / 0
XML access using DOM
    #33746946
Фотография Pitbull terrier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
XML access using DOM
    #33747116
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, интересно получается.

А что если использовать встроенные в 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
XML access using DOM
    #33747121
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался, можно вот таким образом:

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


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