2017-02-22 9 views
0

У меня есть файл свойств, который имеет ключевые значения тега имени в файлах 2 xml, один из которых является исходным, а другой - адресом назначения.Добавление содержимого из одного XML-файла в другой в JAVA

Мне нужно проверить, есть ли тег имени с тем же значением из файла свойств в месте назначения xml, если его там я ничего не должен делать, если его нет, то исходный XML-файл должен быть итерирован для поиска имени значение тега, которое находится в файле свойств. После того, как он нашел то же имя тега должно быть добавлено из source.xml файла destination.xml файл ..

Пожалуйста, помогите мне в этом коде Java

private void updateCofigDestn() throws ParserConfigurationException, TransformerConfigurationException, TransformerException, IOException, SAXException { 
    prop = loadConfigProperties(); 
    String ConfigSrcFile = prop.getProperty("ConfigSourceFile"); 
    String ConfigDesnFile = prop.getProperty("ConfigDestnFile"); 
    System.out.println("\nConfig Destn Path update config :: " + ConfigDesnFile); 
    File configSrcFile = new File(ConfigSrcFile + "\\config.xml"); 
    File configDstnFile = new File(ConfigDesnFile + "\\config.xml"); 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    dbFactory.setValidating(false); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    Document docSrc = dBuilder.parse(configSrcFile); 
    Document docDestn = dBuilder.parse(configDstnFile); 

    Set <Object> keys = getAllKeys(); 
    for (Object k: keys) { 
     if (k.toString().startsWith("JDBC")) { 
      System.out.println("Inside Keys"); 
      String key = (String) k; 
      keyVal = getPropertyValue(key); 
      System.out.println(key + ": " + getPropertyValue(key)); 


      NodeList listSrc = 
       docSrc.getElementsByTagName("jdbc-system-resource"); 
      NodeList listDsn = 
       docDestn.getElementsByTagName("jdbc-system-resource"); 
      System.out.println("listDsn.item(0)" + listDsn.item(0).getTextContent()); 

      if (listDsn.item(0) != null) { 

       for (int t = 0; t < listDsn.getLength(); t++) { 
        Element elmntDsn1 = (Element) listDsn.item(t); 
        String DsNameDsn1 = elmntDsn1.getElementsByTagName("name").item(0).getTextContent(); 
        System.out.println("DS At DESTN in Update Conf " + DsNameDsn1); 

        if (keyVal.equalsIgnoreCase(DsNameDsn1)) {} else { 

         for (int temp = 0; temp < listSrc.getLength(); temp++) { 
          Element elmntSrc = (Element) listSrc.item(temp); 
          String DsNameSrc = elmntSrc.getElementsByTagName("name").item(0).getTextContent(); 
          // elmntSrc.getElementsByTagName(keyVal).item(0).getTextContent(); 

          // configDestn(keyVal); 
          //System.out.println("value bool >>>>> " +res) ; 

          if (keyVal.equalsIgnoreCase(DsNameSrc) && keyVal != null) { 

           Node copiedNode = docDestn.importNode(elmntSrc, true); 
           docDestn.getDocumentElement().appendChild(copiedNode); 
           System.out.println(" Updating the destination Config File"); 
           TransformerFactory.newInstance().newTransformer().transform(new DOMSource(docDestn), 
            new StreamResult(new FileWriter(configDstnFile))); 
          } 
         } 

        } 
       } 
      } else { 
       System.out.println("Destination List is null "); 
       for (int temp = 0; temp < listSrc.getLength(); temp++) { 

        Element elmntSrc = (Element) listSrc.item(temp); 
        String elmntValSrc = elmntSrc.getElementsByTagName("name").item(0).getTextContent(); 
        if (keyVal.equalsIgnoreCase(elmntValSrc) && 
         keyVal != null) { 
         Node copiedNode = docDestn.importNode(elmntSrc, true); 
         docDestn.getDocumentElement().appendChild(copiedNode); 
         System.out.println(" Updating the destination Config File in NULL"); 
         TransformerFactory.newInstance().newTransformer().transform(new DOMSource(docDestn), 
          new StreamResult(new FileWriter(configDstnFile))); 
        } 
       } 
      } 
     } 
    } 
} 

Для экс ..

config.properties

file1 = def 
file2 = xyz 
file3 = abc 

source.xml

destination.xml

<domain> 
    <node1> 
     <name>abc</name> 
    </node1> 
</domain> 

Шаг1: Он принимает значение ключа файла 1 'четкости' из файла свойств и проверки в destination.xml файле, так как его не там будет добавьте его.

Шаг 2: Он принимает следующее значение ключа файла 2 'xyz' из файла свойств и проверяет файл destination.xml, так как его там нет.

Шаг 3: Он принимает следующее ключевое значение файла 3 'abc' из файла свойств и проверяет его в файле destination.xml или нет, поскольку его там он не будет добавлен.

А теперь destination.xml должно быть выглядит,

<domain> 
    <node1> 
     <name>abc</name> 
    </node1> 
    <node0> 
     <name>xyz</name> 
    </node0> 
    <node2> 
     <name>def</name> 
    </node2> 
</domain> 

Это мое требование сделать в JAVA, я пытался много кодирования.

Пожалуйста, помогите мне в этом ..

ответ

0

Вы почти там.

Ошибка, которую вы делаете, заключается в использовании внутреннего 3-х уровневого вложенного цикла, тогда как требуется только 2-уровневый вложенный цикл for.

Цикл listSrc должен находиться за пределами destSrc.

Попробуйте это ниже.

package com.tmp; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.Map; 
import java.util.Properties; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class Tmp { 

    public static void main(String[] args) { 

     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 

     try { 

      DocumentBuilder builder = builderFactory.newDocumentBuilder(); 

      XPath path = XPathFactory.newInstance().newXPath(); 

      Document destDocument = builder.parse(new FileInputStream("D:\\tmp\\destination.xml")); 
      Document srcDocument = builder.parse(new FileInputStream("D:\\tmp\\source.xml")); 

      Element destRootEle = destDocument.getDocumentElement(); 
      Element srcRootEle = srcDocument.getDocumentElement(); 

      Properties properties = new Properties(); 

      properties.load(new FileInputStream("D:\\tmp\\config.properties")); 

      // read properties from config.properties file one by one 
      for (Map.Entry<Object, Object> entry : properties.entrySet()) { 

       String propVal = (String) entry.getValue(); 

       NodeList destNodeList = (NodeList) path.evaluate("//name", destRootEle, XPathConstants.NODESET); 

       boolean destNodeNotExist = true; 

       // iterate through the destination.xml to check whether property value is exist or not 
       for (int i = 0; i < destNodeList.getLength(); i++) { 

        Node node = destNodeList.item(i); 

        if (propVal.trim().equals(node.getTextContent().trim())) { 

         destNodeNotExist = false; 

         break; 
        } 
       } 


       // if the property value is not found in destination.xml then check for the node in source.xml to add to the destination.xml 
       if (destNodeNotExist) { 

        NodeList srcNodeList = (NodeList) path.evaluate("//name", srcRootEle, XPathConstants.NODESET); 

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

         Node missingNodeToAdd = srcNodeList.item(i); 

         if (propVal.trim().equals(missingNodeToAdd.getTextContent().trim())) { 

          destRootEle.appendChild(destDocument.adoptNode(missingNodeToAdd.getParentNode())); 

          break; 
         } 
        } 
       } 
      } 

      // save the changes made to destination.xml file into file system 
      Transformer tr = TransformerFactory.newInstance().newTransformer(); 
      tr.setOutputProperty(OutputKeys.INDENT, "yes"); 
      tr.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
      tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
      tr.transform(new DOMSource(destDocument), new StreamResult(new FileOutputStream("D:\\tmp\\destination.xml"))); 

     } catch (Exception e) { 

      e.printStackTrace(); 

     } 
    } 
} 
+0

Спасибо alot Bro, это идеальное изменение кода, которое указало вместо использования вложенных циклов, – Jeelan

Смежные вопросы