2015-12-04 3 views
0

Я пытаюсь добавить последовательность узлов под узлом, ниже моя ссылка XML:Xpath вставки последовательности узлов под узлом - Java

<?xml version="1.0" encoding="UTF-8"?> 
 
<transformation> 
 
    <info> 
 
    <name>Bulkload</name> 
 
    <description/> 
 
    <extended_description/> 
 
    <trans_version/> 
 
    <trans_type>Normal</trans_type> 
 
    <trans_status>0</trans_status> 
 
    <directory>&#x2f;</directory> 
 
    </info> 
 
    <connection> 
 
    <name>con_name</name> 
 
    <server>server</server> 
 
    <type>SYBASE</type> 
 
    <access>Native</access> 
 
    <database>database</database> 
 
    <port>port</port> 
 
    <username>user</username> 
 
    <password>Encrypted xyz</password> 
 
    
 
    </connection> 
 

 
    <step> 
 
    <name>Extract</name> 
 
    <type>TextFileOutput</type> 
 
    <fields> 
 

 
**HERE** 
 
<field> 
 
</field> 
 
\t </fields> 
 
    <cluster_schema/> 
 
<remotesteps> <input> </input> <output> </output> </remotesteps> <GUI> 
 
     <xloc>300</xloc> 
 
     <yloc>168</yloc> 
 
     <draw>Y</draw> 
 
     </GUI> 
 
    </step> 
 
</transformation>

Я хочу добавить ниже XML блок внутри поля тега:

<field> 
 
      <name>field_name</name> 
 
      <type>Integer</type> 
 
      <format>&#x23;&#x3b;-&#x23;</format> 
 
      <currency/> 
 
      <decimal>.</decimal> 
 
      <group>,</group> 
 
      <nullif/> 
 
      <trim_type>none</trim_type> 
 
      <length>9</length> 
 
      <precision>0</precision> 
 
</field>

Моим требованием является создание новых XML-документов из вышеуказанного шаблона. Я только нашел способ в Xpath, чтобы вставить узел перед узлом, так что я обновил свой шаблон и добавлен пустой узел поля в нем внутри полей узел, и с этим я был в состоянии вставить узел на код ниже:

 File dest =new File("H:\\Project_Documents\\reference.ktr"); 
     DocumentBuilderFactory factory = DocumentBuilderFactory 
        .newInstance(); 
      factory.setIgnoringComments(true); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      String newLine = System.getProperty("line.separator"); 
      Document document = builder.parse(dest); 
      XPathFactory xpathFactory = XPathFactory.newInstance(); 
      XPath xpath = xpathFactory.newXPath(); 

      NodeList nodes = document.getElementsByTagName("field"); 
      Text a = document.createTextNode("Anup"); 
      Element p =document.createElement("field"); 
      p.appendChild(a); 
nodes.item(0).getParentNode().insertBefore(p, nodes.item(0)); 

но снова я столкнулся с проблемой дам для дочерних узлов, т. Е. Имя, тип, формат и т. Д. Может ли кто-нибудь показать мне способ достижения моей цели?

Если я не могу достичь этого с помощью Xpath, то какой парсер я должен использовать?

+0

Почему я s, помеченный как XPath, я не вижу никакого использования XPath. И в чем именно проблема, создавая те узлы, которые вы хотите вставить с помощью W3C DOM, или вставляя вновь созданный узел в определенную позицию? –

+0

Привет, Мартин, Спасибо за ваш комментарий. Я использую Xpath для вставки узла, поэтому я пометил xpath. Я хочу вставить вновь созданный узел внутри узла (вместо ** ЗДЕСЬ **). – Explorer

+0

Прошу прощения, если я сделал это запутанным, я из неанглийской страны. – Explorer

ответ

1

Одно решение, которое работает:

Вы должны управлять два XML-документами, найти тег вы хотите, и заменить.

С XPath вы можете выбрать более точно, но не использовать его.

1 получить DOM для глобального XML

Document document= ... 

2 получить узел, который вы хотите вставить

Document document_to_insert = builder.parse(new InputSource(new StringReader(xml_to_insert))); // ... 

//GET NODE field 
NodeList nodes_field_to_insert=document_to_insert.getElementsByTagName("field"); 

Element node_field_to_insert=null; 

for(int i=0; i<nodes_field_to_insert.getLength(); i++) 
{ 
Node the_node = nodes_field_to_insert.item(i); 

// WE TAKE THE FIRST ONE 
if(the_node instanceof Element) 
    { 
    node_field_to_insert=(Element) the_node; 
    break; 
    } 
} 

3 Перейдите к узлу поля в глобальной XML

4 заменить внутри узла

// GET NODE field 
NodeList nodes=document.getElementsByTagName("field"); 

for(int i=0; i<nodes.getLength(); i++) 
{ 
    Node the_node = nodes.item(i); 

    if(the_node instanceof Element) 
    { 
    Element a_child = (Element) the_node; 
    Node newNode = document.importNode(node_field_to_insert, true); 

    // FATHER 
    Node the_parent=a_child.getParentNode(); 
    the_parent.replaceChild(newNode,a_child); 

    // WE STOP 
    break; 
} 
} 
Смежные вопросы