Как добавить детей в дочерние узлы, используя документ jsoup - PullRequest
6 голосов
/ 01 марта 2012

Я пытаюсь создать следующий пример.

<body>
  <resources>
    <string-array name="mytest">
      <item number="1">
        <name>Testname</name>
      </item>
      <item number="2">
        <name>blaat..</name>
      </item>
    </string-array>
  </resources>
</body>

Я пытаюсь сделать это следующим образом:

FileInputStream fis = openFileInput("test1.xml");

Document doc = Jsoup.parse(fis, "UTF-8", "");
Node node = doc.getElementsByTag("item").get(getPosition());

fis.close();
fis = openFileInput("test2.xml");
Document doc2 = Jsoup.parse(fis, "UTF-8", "");
fis.close();

Elements test = doc2.getElementsByTag("resources");
if(test.size() < 0){
fis = openFileInput("test2.xml");
doc2 = Jsoup.parse(fis, "UTF-8", "");
fis.close();
doc2.appendElement("resources").parent();
FileOutputStream os = openFileOutput("test2.xml", Context.MODE_PRIVATE);
os.write(doc2.toString().getBytes());
os.close();

fis = openFileInput("test2.xml");
doc2 = Jsoup.parse(fis, "UTF-8", "");
fis.close();
doc2.appendChild(doc2.appendElement("string-array").attr("name", "mytest")).parent();
os = openFileOutput("test2.xml", Context.MODE_PRIVATE);
os.write(doc2.toString().getBytes());
os.close();

System.out.println("Created file\n");
}

doc2.appendChild(node);
FileOutputStream os = openFileOutput("test2.xml", Context.MODE_PRIVATE);

os.write(doc2.toString().getBytes()); 
os.close();

А теперь я получаю:

<!-- test1.xml (input) -->
<resources>
  <string-array name="firsttest">
    <item number="1">
      <name>Testname</name>
    </item>
    <item number="2">
      <name>blaat..</name>
    </item>
    <item number="3">
      <name>Next item</name>
    </item>
  </string-array>
</resources>

<!-- test2.xml (output)-->
<body>
  <resources></resources>
  <string-array name="mytest"></string-array>
  <item number="1">
    <name>Testname</name>
  </item>
  <item number="2">
    <name>blaat..</name>
  </item>
</body>

Кто-нибудь может сказать мне, что я делаю неправильно, и, может быть, привести несколько примеров того, как это должно быть сделано?

Заранее спасибо

РЕДАКТИРОВАТЬ: Чтобы дать немного больше деталей: я хочу скопировать некоторые элементы из test1.xml в test2.xml. Таким образом, в основном пользователь выбирает элемент списка, который указывает на число в text1.xml (номер элемента), и этот элемент затем следует скопировать в (ПУНКТ ЗДЕСЬ

Ответы [ 2 ]

10 голосов
/ 01 марта 2012

Jsoup обычно используется для анализа html, а не xml, хотя они имеют одинаковую структуру. По умолчанию Jsoup анализирует что-либо, а затем оборачивает его в <html><body> ... </body></html>.

Пример вашей цели:

import org.jsoup.nodes.*;

Document doc = Jsoup.parse("");
// clear <html><body></body></html>
doc.html("");

Element e = doc.appendElement("body").appendElement("resources");

e = e.appendElement("string-array");
e.attr("name", "mytest");

for (int i = 0; i < 10; i++) {
    Element sub = e.appendElement("item");
    sub.attr("number", Integer.toString(i));
    sub.appendElement("name").text("blahh");
}

Ссылки:

1 голос
/ 01 марта 2012

Это не решит вашу точную проблему, но вы должны быть в состоянии понять это отсюда.Я создаю test2.xml в качестве нового документа.Итак, если это существует с информацией в нем, вам придется обойти это.

    String html = 
        "<resources>" +
          "<string-array name=\"firsttest\">" +
            "<item number=\"1\">" +
             "<name>Testname</name>" +
            "</item>" +
            "<item number=\"2\">" +
              "<name>blaat..</name>" +
            "</item>" +
            "<item number=\"3\">" +
              "<name>Next item</name>" +
            "</item>" +
          "</string-array>" +
        "</resources>";

    Document test1 = Jsoup.parse(html);

    Document test2 = Jsoup.parse("");
    test2.body().append("<resources>");
    test2.select("resources").append("<string-array name='mytest'>");
    test2.select("[name=mytest]").append(test1.select("item[number=1]").toString());
    test2.select("[name=mytest]").append(test1.select("item[number=2]").toString());

    System.out.println(test2.body().children());

Вот вывод:

    <resources>
    <string-array name="mytest">
     <item number="1"> 
      <name>
        Testname 
      </name> 
     </item>
     <item number="2"> 
      <name>
        blaat.. 
      </name> 
     </item>
    </string-array>
    </resources>
...