добавление нового узла в указанное место с использованием dom4j в xml - PullRequest
1 голос
/ 26 августа 2011

Мой код для вставки новой пары кредитов на желаемом уровне машины.

Document insertNewNode(String loginId,String pass,String machine_name)
{
List<?> list1 = document.selectNodes("//machine/@name" );
Iterator<?> itr=list1.iterator();
while(itr.hasNext()){
Attribute attribute=(Attribute)itr.next();
if( attribute.getValue().equals(machine_name))
{
    List<?> list1 = document.selectNodes("//machine" );
    Iterator<?> iter=list.iterator();
    while(iter.hasNext()){
    Element credPairs=(Element)iter.next();
    Element credPair =credPairs.addElement("cred-pair");
    Element login =credPair.addElement("login");
    element.setText(loginId);
    Element password =credPair.addElement("password");
    element.setText(pass);

}

}
}
}

Оригинал xml:

<credentials>
<machine name="xyz">
<cred-pairs>
<cred-pair>
<login>asad</login>
<password>12345</password>
</cred-pair>
<cred-pairs>
</machine>
<machine name="pqr">
<cred-pair>
<cred-pair>
<login>ssdas</login>
<password>12345</password>
</cred-pair>
<cred-pairs>
</machine>
</credentials>

Если я вызываю insertNewNode (ggss, 97653, xyz)

Ожидаемый xml:

<credentials>
 <machine name="xyz">
  <cred-pairs>
   <cred-pair>
    <login>asad</login>
    <password>12345</password>
   </cred-pair>
 **<cred-pair>
    <login>ggss</login>
    <password>97653</password>
   </cred-pair>**
   <cred-pairs>
 </machine>
 <machine name="pqr">
  <cred-pair>
   <cred-pair>
    <login>ssdas</login>
    <password>12345</password>
   </cred-pair>
   <cred-pairs>
 </machine>
</credentials>

Но я получаю вывод как:

<credentials>
 <machine name="xyz">
  <cred-pairs>
   <cred-pair>
    <login>asad</login>
    <password>12345</password>
   </cred-pair>
** <cred-pair>
    <login>ggss</login>
    <password>97653</password>
   </cred-pair>**
  <cred-pairs>
 </machine>
 <machine name="pqr">
  <cred-pair>
   <cred-pair>
    <login>ssdas</login>
    <password>12345</password>
   </cred-pair>
 **<cred-pair>
    <login>ggss</login>
    <password>97653</password>
   </cred-pair>
  <cred-pairs>**
 </machine>
</credentials>

1 Ответ

1 голос
/ 26 августа 2011

После отступа я увидел, что у вас xml плохо отформатирован. Прямо перед </machine> есть один <cred-pairs> открывающий тег, и в этом месте это запрещено. Может быть ошибка копирования / вставки.

После того, как вы нашли правильный атрибут имени машины, вы выбираете все узлы машины и добавляете учетные данные для каждого узла машины. Вместо этого вы должны выбирать не атрибуты, а элементы, которые соответствуют имени машины:

List<Element> machines = document.selectNodes(String.format("//machine[@name='%s']", machine_name);
for (Element machine:machines) {
    Element credPairs=(Element)iter.next();
    Element credPair =credPairs.addElement("cred-pair");
    Element login =credPair.addElement("login");
    login.setText(loginId);
    Element password =credPair.addElement("password");
    password.setText(pass);
    machine.addElement(credPairs);    
}

Не проверено, но должно работать (или показать вам направление)

...