kzen.dev
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 kentcdodds
kentcdodds
Question

Dapatkan XML hanya elemen anak langsung XML berdasarkan nama

Pertanyaan saya adalah: Bagaimana saya bisa mendapatkan elemen langsung di bawah elemen induk tertentu ketika ada elemen lain dengan nama yang sama dengan "cucu &" dari elemen induk.

Saya menggunakan Java DOM library untuk mengurai XML Elemen dan saya mengalami masalah. Berikut ini beberapa (sebagian kecil) dari xml yang saya gunakan:

<notifications>
  <notification>
    <groups>
      <group name="zip-group.zip" zip="true">
        <file location="C:\valid\directory\" />
        <file location="C:\another\valid\file.doc" />
        <file location="C:\valid\file\here.txt" />
      </group>
    </groups>
    <file location="C:\valid\file.txt" />
    <file location="C:\valid\file.xml" />
    <file location="C:\valid\file.doc" />
  </notification>
</notifications>

Seperti yang bisa Anda lihat, ada dua tempat Anda dapat menempatkan elemen <file>. Baik di dalam grup atau di luar grup. Saya benar-benar menginginkannya terstruktur dengan cara ini karena lebih ramah pengguna.

Sekarang, setiap kali saya memanggil notificationElement.getElementsByTagName("file"); itu memberi saya semua elemen <file>, termasuk yang berada di bawah elemen <group>. Saya menangani setiap jenis file ini secara berbeda, sehingga fungsi ini tidak diinginkan.

Saya telah memikirkan dua solusi:

  1. Dapatkan elemen induk dari elemen berkas dan tangani sesuai dengan itu (tergantung pada apakah itu <notification> atau <group>.
  2. Ubah nama elemen &<file> kedua untuk menghindari kebingungan.

Kedua solusi tersebut tidak lebih baik daripada membiarkannya seperti apa adanya dan hanya mendapatkan elemen &<file> yang merupakan anak langsung dari elemen <notification>.

Saya terbuka untuk komentar dan jawaban IMPO tentang cara terbaik untuk melakukan hal ini, tetapi saya sangat tertarik dengan solusi DOM karena itulah yang digunakan oleh proyek ini. Terima kasih.

39 2012-05-21T17:36:42+00:00 3
 kentcdodds
kentcdodds
Pertanyaan edit 21 Mei 2012 в 6:08
Pemrograman
java
xml
parsing
dom
xml-parsing
Pertanyaan ini memiliki :value jawaban dalam bahasa Inggris, untuk membacanya masuk ke akun Anda.
 Alex
Alex
21 Mei 2012 в 5:58
2012-05-21T17:58:27+00:00
Lebih
Sumber
Sunting
#16241912

Anda bisa menggunakan XPath untuk ini, menggunakan dua jalur untuk mendapatkannya dan memprosesnya secara berbeda.

Untuk mendapatkan node &<File> anak langsung dari <notifikasi> gunakan //notifikasi/file dan untuk yang ada di <grup> gunakan //groups/group/file.

Ini adalah contoh sederhana:

public class SO10689900 {
    public static void main(String[] args) throws Exception {
        DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader("<notifications>\n" + 
                "  <notification>\n" + 
                "    <groups>\n" + 
                "      <group name=\"zip-group.zip\" zip=\"true\">\n" + 
                "        <File location=\"C:\\valid\\directory\\\" />\n" + 
                "        <File location=\"C:\\this\\file\\doesn't\\exist.grr\" />\n" + 
                "        <File location=\"C:\\valid\\file\\here.txt\" />\n" + 
                "      </group>\n" + 
                "    </groups>\n" + 
                "    <File location=\"C:\\valid\\file.txt\" />\n" + 
                "    <File location=\"C:\\valid\\file.xml\" />\n" + 
                "    <File location=\"C:\\valid\\file.doc\" />\n" + 
                "  </notification>\n" + 
                "</notifications>")));
        XPath xpath = XPathFactory.newInstance().newXPath();
        XPathExpression expr1 = xpath.compile("//notification/file");
        NodeList nodes = (NodeList)expr1.evaluate(doc, XPathConstants.NODESET);
        System.out.println("Files in //notification");
        printFiles(nodes);

        XPathExpression expr2 = xpath.compile("//groups/group/file");
        NodeList nodes2 = (NodeList)expr2.evaluate(doc, XPathConstants.NODESET);
        System.out.println("Files in //groups/group");
        printFiles(nodes2);
    }

    public static void printFiles(NodeList nodes) {
        for (int i = 0; i < nodes.getLength(); ++i) {
            Node file = nodes.item(i);
            System.out.println(file.getAttributes().getNamedItem("location"));
        }
    }
}

Ini harus menghasilkan output:

Files in //notification
location="C:\valid\file.txt"
location="C:\valid\file.xml"
location="C:\valid\file.doc"
Files in //groups/group
location="C:\valid\directory\"
location="C:\this\file\doesn't\exist.grr"
location="C:\valid\file\here.txt"
13
0
Solution / Answer
 kentcdodds
kentcdodds
21 Mei 2012 в 6:22
2012-05-21T18:22:34+00:00
Lebih
Sumber
Sunting
#16241913

Nah, solusi DOM untuk pertanyaan ini sebenarnya cukup sederhana, meskipun tidak terlalu elegan Ketika saya mengiterasi filesNodeList yang dikembalikan ketika saya memanggil notificationElement.getElementsByTagName("file"); Saya hanya memeriksa apakah nama simpul induknya adalah "notifikasi. " Jika tidak, maka saya abaikan karena akan ditangani oleh elemen <group>. Inilah solusi kode saya:

for (int j = 0; j < filesNodeList.getLength(); j++) {
  Element fileElement = (Element) filesNodeList.item(j);
  if (!fileElement.getParentNode().getNodeName().equals("notification")) {
    continue;
  }
  ...
}
12
0
 arthur
arthur
21 Mei 2012 в 6:24
2012-05-21T18:24:27+00:00
Lebih
Sumber
Sunting
#16241914

Jika Anda tetap menggunakan API DOM

NodeList nodeList = doc.getElementsByTagName("notification")
    .item(0).getChildNodes();

// get the immediate child (1st generation)
for (int i = 0; i < nodeList.getLength(); i++)
    switch (nodeList.item(i).getNodeType()) {
        case Node.ELEMENT_NODE:

            Element element = (Element) nodeList.item(i);
            System.out.println("element name: " + element.getNodeName());
            // check the element name
            if (element.getNodeName().equalsIgnoreCase("file"))
            {

                // do something with you "file" element (child first generation)

                System.out.println("element name: "
                    + element.getNodeName() + " attribute: "
                    + element.getAttribute("location"));

            }
    break;

}

Tugas pertama kita adalah mendapatkan elemen "Notification" (dalam hal ini -item pertama (0)-) dan semua anak-anaknya:

NodeList nodeList = doc.getElementsByTagName("notification")
    .item(0).getChildNodes();

(nanti Anda dapat bekerja dengan semua elemen menggunakan mendapatkan semua elemen).

Untuk setiap anak dari "Notification":

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

Anda terlebih dahulu mendapatkan jenisnya untuk melihat apakah itu sebuah elemen:

switch (nodeList.item(i).getNodeType()) {
    case Node.ELEMENT_NODE:
        //.......
        break;  
}

Jika demikian, maka Anda mendapatkan anak "file" , yang bukan cucu "Notification"

dan Anda dapat memeriksanya:

if (element.getNodeName().equalsIgnoreCase("file"))
{

    // do something with you "file" element (child first generation)

    System.out.println("element name:"
        + element.getNodeName() + " attribute: "
        + element.getAttribute("location"));

}

dan ouptutnya adalah:

element name: file
element name:file attribute: C:\valid\file.txt
element name: file
element name:file attribute: C:\valid\file.xml
element name: file
element name:file attribute: C:\valid\file.doc
 dckuehn
dckuehn
Jawaban edit 25 Januari 2017 в 6:01
4
0
Related communities 3
Programmer JAVA indonesia
Programmer JAVA indonesia
1 726 pengguna
Buka telegram
jvmusergroup
jvmusergroup
354 pengguna
Bismillahirrohmanirohim. Perhatian! Grup ini merupakan ekspansi dari grup Forum Java Programmer Indonesia di Facebook. Silahkan berbagi pengalaman dan masalah seputar Java dan keluarganya. https://t.me/JVMIndonesia Admin : @hendisantika34
Buka telegram
Java Indonesia🇲🇨
Java Indonesia🇲🇨
154 pengguna
Programmer Java Indonesia. Grup ini digunakan untuk bertanya terkait materi belajar Java / fullstack Warning=> -dilarang promosi(izin adm -18+🔞 - berbicara sopan - no spam /boot Mohon ikut aturan grup belum di keluarkan
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Daniel Gogov
Terdaftar 6 hari yang lalu
2
工藤 芳則
Terdaftar 1 minggu yang lalu
3
Ирина Беляева
Terdaftar 2 minggu yang lalu
4
Darya Arsenyeva
Terdaftar 2 minggu yang lalu
5
anyta nuam-nuam (LapuSiK)
Terdaftar 2 minggu yang lalu
ID
JA
KO
RU
© kzen.dev 2023
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi