Member 12997518 Ответов: 1

Читаю постоянно загружен XML-файл из определенной папки и извлечения данных на базе


На месте в Исландии у них есть прибор, который делает химический анализ материала, который они вынули из печи.
Этот прибор использует программное обеспечение для составления отчета об анализе (см. прилагаемый документ о программном обеспечении).

Эта информация отчета должна быть отправлена в базу данных, откуда они могут извлечь эту информацию.
На данный момент я создал веб-страницу, на которую они могут загрузить экспортированный xml-файл отчета, а затем эта веб-страница извлекает данные и помещает их в базу данных нашего сервера на сайте.
Теперь требуется автоматизировать этот процесс, поэтому вместо того, чтобы вручную загружать xml-файл на веб-страницу, необходимо написать приложение для мониторинга папки, и если какие-либо новые XML-файлы будут сохранены в папке, данные должны быть извлечены из файла/файлов и сохранены в базе данных.

Что я уже пробовал:

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;	


public class Dom
{

	
   public static void main (String[] args)
   
   {
   String badnumber = "MPP";
   int badnumberconverted; 
   
   try {
      badnumberconverted = Integer.parseInt(badnumber);
   }catch (NumberFormatException nfEx){
  // System.out.println("banumber*1000000");
         }
      
               DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      try {
               DocumentBuilder builder = factory.newDocumentBuilder();
               Document doc = builder.parse("repeat.xml");
               NodeList sampleIDs = doc.getElementsByTagName("Elements");
       for(int i=0;i<sampleIDs.getLength();i++){
               Node p = sampleIDs.item(i);
            if(p.getNodeType() == Node.ELEMENT_NODE){
               Element Elements = (Element) p;
               String id = Elements.getAttribute("id");
               NodeList nameList = Elements.getChildNodes();
             for(int j=0;j<nameList.getLength();j++){
               Node n = nameList.item(j);
             if(n.getNodeType() == Node.ELEMENT_NODE){
                Element name = (Element) n;
                  // System.out.println( convert(name.getTextContent()));
                System.out.println("Elements" + id + ":" + name.getTagName()+ "=" + name.getTextContent());
                  
                  }
               }
            }
         }     
      }  
               catch (ParserConfigurationException e){
      
                  e.printStackTrace();
      }
               catch (SAXException e)
      {
                  e.printStackTrace();
      }
                catch (IOException e){
         
                  e.printStackTrace();
      }
   }
   
  public static String convert(String val) 
   
   {
   
   double d = Double.parseDouble(val);
   d = d/1000000;
   
   return Double.toString(d);
   
                          
                      
        }    
   
   }

Garth J Lancaster

Кстати-Ваш вопрос был "(см. прилагаемый документ по программному обеспечению) " - я не смог найти ссылку на него, извините ...

Хитрость заключается в том, чтобы перечислить все ваши требования, все, что может пойти правильно, все, что может пойти не так, какая отказоустойчивость/надежность вам нужна и т. д.

1 Ответов

Рейтинг:
5

Garth J Lancaster

Я не могу помочь вам в java извините - в c# я бы (возможно, не зная больше ваших требований)

а) написать 'для Win32' обслуживание
б) служба будет использовать FileSystemWatcher Класс FileSystemWatcher (System.IO)[^]
в) при добавлении файла
ки) правильное название
ции) с соответствующим содержанием
Я бы
d) извлеките и загрузите xml/данные и загрузите их в свою базу данных
e) любые файлы без соответствующего имени и / или содержимого в ci & amp;& cii помещаются в файл ошибки и сообщаются позже
f) сервис будет предоставлять (через какой-то интерфейс) статистику по успешным файлам и файлам "ошибок" и т. д

Это может быть разделено на "два разных" сервиса/приложения, но, возможно, это излишне, это зависит от объема / частоты загрузок и т. д


в c# вы можете использовать "TopShelf" в качестве основы для сервиса - на это стоит обратить внимание [NuGet Gallery | Topshelf.Класса filesystemwatcher 1.0.0.17](https://www.nuget.org/packages/Topshelf.Класса filesystemwatcher/) [^]


Я почти уверен, что это достаточно легко сделать на java


Member 12997518

Гарт,
Я уже две недели борюсь за то, чтобы сделать это правильно. У нас есть компьютер с программным обеспечением для анализа XRF, которое постоянно генерирует отчет в формате xml, и он сохраняется в определенной папке на локальном диске. Поэтому мне нужно написать программу, которая обнаружит, что новый xml-файл был сохранен, извлекет данные из этого файла и запишет их в sql server 2008 R2. после того, как данные были извлечены, xml-файл может быть переименован. Вы можете помочь мне с C#. Очень благодарен за вашу помощь.

Garth J Lancaster

конечно, но вы должны понимать, что Codeproject-это не "написать код для заказа услуги" - большинство здесь (и я, вероятно, должен) ответить "попробуйте rentacoder" - предпосылка Codeproject заключается в том, что люди приходят сюда с кодом/предметами, в которых им нужна помощь, а не "пожалуйста, напишите это с нуля" - и 99,9% людей здесь являются добровольцами, большинство из них работают полный рабочий день-я не так, как это происходит в данный момент, поэтому я не зарабатываю $$

Написать сервис, чтобы делать то, что вы хотите, на первый взгляд не так уж сложно - вот, например, две ссылки

http://www.jaysonrowe.com/2012/09/using-topshelf-to-create-windows-service.html

https://github.com/mchudinov/FileWatcher/blob/master/FileWatcher/Jobs/FileProcessingJob.cs

Проблема, которую я нахожу в коммерческом смысле, заключается (как обычно) в деталях или их отсутствии - FileSystemWatcher может быть трудно справиться, если, например, файл создается, добавляется и выдается несколько уведомлений - программа, использующая FileSystemWatcher, действительно должна знать, когда файл "готов к потреблению" в вашем случае, загружаясь в базу данных sqlserver.

Требования, опять же - вам даже нужна загрузка в реальном времени в базу данных ? - в отличие от "почти реального времени", например, вы используете "опросное" решение и проверяете файлы каждые (скажем) 15 минут

Теперь вы понимаете, почему я отказываюсь писать ваш код для вас ? если вы идете на мастер-курс IDesign Architects: -) одна вещь, которая становится ясной, заключается в том, что все, что не так с реализацией, является результатом неспособности архитектора адекватно собрать и проанализировать требования

Кто говорит, что "написание службы" правильно ? было бы что-то вроде движка рабочего процесса https://www.codeproject.com/Articles/1164009/Wexflow-Open-source-workflow-engine-in-Csharp будьте "более подходящими" - опять же, требования - кто пользователи системы, кто будет следить за ней, устранять неполадки и т. д.-каковы их потребности ?

[edit] как насчет приложения COTS scheduler/workflow - зачем писать его для себя - как вы сказали, это для клиента в Исландии, ваш профиль предполагает, что вы находитесь в/из Южной Африки, так что разве поддержка, надежность, надежность не будут большой проблемой ? [/редактировать]