Чтение сложного xml файла java dom

 
 
 
Сообщения:7
Добрый день
Я получаю от клиента xml. В нем содержится информация по документам.
Структура такова.
Имеем дерово
Тег <Import xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">,
который содержит группу <Factures> (накладные).
В свою очередь группа <Factures> имеет группу <doc> (документ).
Тег <doc> </doc> содержит данные по документу
заголовок документа
<datd_doc>24.08.2016</datd_doc> дата документа
<num_doc>0001</num_doc> номер документа
<cod_potr>00580</cod_potr> код получателя

дальше строки документа
<row_doc> </row_doc> содержимое строки документа
<cod_prod>3801</cod_prod> код товара
<kol>1540</kol> кол-во товара
<sum_bez_nds>100</sum_bez_nds><!--Сумма без ндс-->
<sum_nds>20</sum_nds><!--Сумма ндс-->
<sum_s_nds>120</sum_s_nds><!--Сумма c ндс-->

<?xml version="1.0" encoding="UTF-8"?>
<import xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <factures>
	<doc><!--Документ -->
	<!--Далее шапка документа-->
	 <datd_doc>24.08.2016</datd_doc><!--Дата документа-->
	 <num_doc>0001</num_doc><!--Номер документа-->
	 <cod_potr>00580</cod_potr><!--Код клиента-->
	 <!--Далее табличная чать документа-->	
	 <row_doc><!--Строка документа-->
	    <row_doc_number>1</row_doc_number><!--Номер строки документа-->
		<cod_prod>25252</cod_prod><!--Код товара-->
		<kol>12</kol><!--Кол-во товара-->
		<sum_bez_nds>100</sum_bez_nds><!--Сумма без ндс-->
		<sum_nds>20</sum_nds><!--Сумма ндс-->
		<sum_s_nds>120</sum_s_nds><!--Сумма c ндс-->
	 </row_doc>
	 <row_doc>	 
	    <row_doc_number>2</row_doc_number>
		<cod_prod>2552</cod_prod>
		<kol>3</kol>
		<sum_bez_nds>16.88</sum_bez_nds>
		<sum_nds> 3.38</sum_nds>
		<sum_s_nds>20.26</sum_s_nds>
	 </row_doc>
	 <row_doc>
	    <row_doc_number>3</row_doc_number>
		<cod_prod>441</cod_prod>
		<kol>15</kol>
		<sum_bez_nds>170.42</sum_bez_nds>
		<sum_nds>13.63</sum_nds>
		<sum_s_nds>184.05</sum_s_nds>
	 </row_doc>
	</doc>
 </factures>
</import>



Мне его надо прочитать

Код программы

import java.io.*;

import javax.xml.parsers.*;

import org.w3c.dom.*;


public class Ex_xmlread {
	   public static String wdata,wnd,wCod_potr,wcod_prod="";
	    public static Double kol=0.0;
	    public static Integer row=0; 
	    public static InputStream inStream = null;
	    public static OutputStream outStream = null;
	    
	    
	    private static void xmlst3(String in)
	    {
	    	  try {
	    		    File fXmlFile = new File(in);
					DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
					DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
					Document doc = dBuilder.parse(fXmlFile);
				 	doc.getDocumentElement().normalize();
				 	
				 	NodeList nList = doc.getElementsByTagName("doc");
				 	
					for (int temp = 0; temp < nList.getLength(); temp++) {
					
				 		Node nNode = nList.item(temp);
				 		if (nNode.getNodeType() == Node.ELEMENT_NODE) {
				 			Element eElement = (Element) nNode;
				 			wdata=eElement.getElementsByTagName("datd_doc").item(0).getTextContent();
				 			wnd=eElement.getElementsByTagName("num_doc").item(0).getTextContent();
				 			wCod_potr=eElement.getElementsByTagName("cod_potr").item(0).getTextContent();
				 		
				 			NodeList nList2 = doc.getElementsByTagName("row_doc");
				 		
				 			for (int temp2 = 0; temp2 < nList2.getLength(); temp2++) {
				 			
				 				Node nNode2 = nList2.item(temp2);
				 				if (nNode2.getNodeType() == Node.ELEMENT_NODE) {
									Element eElement2 = (Element) nNode2;
									wcod_prod=eElement2.getElementsByTagName("cod_prod").item(0).getTextContent();
								System.out.println("Дата документа "+wdata+" Номер документа "+wnd+" Код клиента "+wCod_potr+" Код товара "+wcod_prod);
				 				}			
				 			}
				 			System.out.println("\n");
				 			}
				 	}
	    	  } catch (Exception e) {
					e.printStackTrace();
				    }
	    }

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File file  = new File("Exem_1.xml");
	    String fi=file.toString();
	    xmlst3(fi);
	}

}


результат

Дата документа 24.08.2016 Номер документа 0001 Код клиента 00580 Код товара 25252
Дата документа 24.08.2016 Номер документа 0001 Код клиента 00580 Код товара 2552
Дата документа 24.08.2016 Номер документа 0001 Код клиента 00580 Код товара 441

Все работает

тестировал на файле с 2 документами

<?xml version="1.0" encoding="UTF-8"?>
<import xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <factures>
	<doc><!--Документ -->
	<!--Далее шапка документа-->
	 <datd_doc>24.08.2016</datd_doc><!--Дата документа-->
	 <num_doc>0001</num_doc><!--Номер документа-->
	 <cod_potr>00580</cod_potr><!--Код клиента-->
	 <!--Далее табличная чать документа-->	
	 <row_doc><!--Строка документа-->
	    <row_doc_number>1</row_doc_number><!--Номер строки документа-->
		<cod_prod>25252</cod_prod><!--Код товара-->
		<kol>12</kol><!--Кол-во товара-->
		<sum_bez_nds>100</sum_bez_nds><!--Сумма без ндс-->
		<sum_nds>20</sum_nds><!--Сумма ндс-->
		<sum_s_nds>120</sum_s_nds><!--Сумма c ндс-->
	 </row_doc>
	 <row_doc>	 
	    <row_doc_number>2</row_doc_number>
		<cod_prod>2552</cod_prod>
		<kol>3</kol>
		<sum_bez_nds>16.88</sum_bez_nds>
		<sum_nds> 3.38</sum_nds>
		<sum_s_nds>20.26</sum_s_nds>
	 </row_doc>
	 <row_doc>
	    <row_doc_number>3</row_doc_number>
		<cod_prod>441</cod_prod>
		<kol>15</kol>
		<sum_bez_nds>170.42</sum_bez_nds>
		<sum_nds>13.63</sum_nds>
		<sum_s_nds>184.05</sum_s_nds>
	 </row_doc>
	</doc>
	<doc>	
	 <datd_doc>24.08.2016</datd_doc>
	 <num_doc>0002</num_doc>
	 <cod_potr>00544</cod_potr>
	 <row_doc>
	    <row_doc_number>1</row_doc_number>
		<cod_prod>222</cod_prod>
		<kol>10</kol>
		<sum_bez_nds>99.07</sum_bez_nds>
		<sum_nds>7.93</sum_nds>
		<sum_s_nds>107.00</sum_s_nds>
	 </row_doc>
	 <row_doc>	 
	    <row_doc_number>2</row_doc_number>
		<cod_prod>444</cod_prod>
		<kol>10</kol>
		<sum_bez_nds>136.11</sum_bez_nds>
		<sum_nds> 10.89</sum_nds>
		<sum_s_nds>147.00</sum_s_nds>
	 </row_doc>
	</doc>
 </factures>
</import>



результат

Дата документа 24.08.2016 Номер документа 0001 Код клиента 00580 Код товара 25252
Дата документа 24.08.2016 Номер документа 0001 Код клиента 00580 Код товара 2552
Дата документа 24.08.2016 Номер документа 0001 Код клиента 00580 Код товара 441
Дата документа 24.08.2016 Номер документа 0001 Код клиента 00580 Код товара 222
Дата документа 24.08.2016 Номер документа 0001 Код клиента 00580 Код товара 444


Дата документа 24.08.2016 Номер документа 0002 Код клиента 00544 Код товара 25252
Дата документа 24.08.2016 Номер документа 0002 Код клиента 00544 Код товара 2552
Дата документа 24.08.2016 Номер документа 0002 Код клиента 00544 Код товара 441
Дата документа 24.08.2016 Номер документа 0002 Код клиента 00544 Код товара 222
Дата документа 24.08.2016 Номер документа 0002 Код клиента 00544 Код товара 444


Как я предпологаю второй цикл
NodeList nList2 = doc.getElementsByTagName("row_doc");
				 		
				 			for (int temp2 = 0; temp2 < nList2.getLength(); temp2++) {
				 			
				 				Node nNode2 = nList2.item(temp2);
				 				if (nNode2.getNodeType() == Node.ELEMENT_NODE) {
									Element eElement2 = (Element) nNode2;
									wcod_prod=eElement2.getElementsByTagName("cod_prod").item(0).getTextContent();
								System.out.println("Дата документа "+wdata+" Номер документа "+wnd+" Код клиента "+wCod_potr+" Код товара "+wcod_prod);
				 				}			
				 			}


Долджен искать теги только в текуем узле <doc>. А у меня ищкет во всем файле
Ошибка возможно сдесь
NodeList nList2 = doc.getElementsByTagName("row_doc");

Но я не нашел решение.
Как быть и правильно ли я делаю. До сих пор парсил xml с простой структурой.
 
 
Сообщения:350
у тебя один цикл в другом. и второй который выводится два раза, начинается каждый раз сначала.
 
 
Сообщения:7
virtus:
у тебя один цикл в другом. и второй который выводится два раза, начинается каждый раз сначала.

Это я понял.

Не нахожу решение с внутренними узлами. Везде одна ветка.

Поэтому и спрашиваю как решить?

NodeList nList2 = doc.getElementsByTagName("row_doc");

А мне надо примерно так
NodeList nList2 = nList.getElementsByTagName("row_doc");

Инициализация второго узла внутри первого.
Изменен:26 авг 2016 12:45
 
 
Сообщения:350
ну вот у тебя есть

Node nNode = nList.item(temp);

а у нода можно получить чайлдов

https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html
 
 
Сообщения:153
А если заменить в строке
NodeList nList2 = doc.getElementsByTagName("row_doc");
"doc" на "eElement"?
Изменен:26 авг 2016 14:10
 
 
Сообщения:7
vps:

А если заменить в строке

NodeList nList2 = doc.getElementsByTagName("row_doc");

"doc" на "eElement"?

Заработало.
Спасибо.
Чувствовал что где-то там.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет