簡體   English   中英

使用DOM獲取具有相同節點名稱的xml文件中的XML節點數

[英]Getting XML number of nodes in a xml file with the same node name using DOM

我需要解析一個xml文件,將值存儲到數據庫中。請考慮以下xml

<Name NameType="Primary Name">
 <NameValue>
   <FirstName>Hassan</FirstName> 
   <MiddleName>Dahir</MiddleName> 
   <Surname>Aweys</Surname> 
   <OriginalScriptName>حسن ظاهرعويس</OriginalScriptName> 
   <OriginalScriptName>ハッサン・ダヒル・アウェイス</OriginalScriptName> 
   <OriginalScriptName>アウェス、ハッサン・ダヒル</OriginalScriptName> 
   <OriginalScriptName>ウワイス、ハッサン・ターヒル</OriginalScriptName> 
 </NameValue>
</Name>

使用DOM解析,解析xml並獲取值。

private static HashMap<String, String> nameDetails(Element nameDetails,String id) throws SQLException {
        HashMap<String, String> Map = new HashMap<String, String>();
         Multimap<String, String> multiMap = ArrayListMultimap.create();
        String pid = null;
        Map.put(pid, id);
        if(nameDetails.hasChildNodes()){
            //System.out.println(nameDetails.getChildNodes().getLength());
            for(int i=0;i<nameDetails.getChildNodes().getLength();i++){
                //check "Name" has attributes or not
                if(nameDetails.getChildNodes().item(i).hasAttributes())
                {
                    for(int a=0;a<nameDetails.getChildNodes().item(i).getAttributes().getLength();a++)
                    {
                        //Name Type values or attributes of Name
                        Map.put(nameDetails.getChildNodes().item(i).getAttributes().item(a).getNodeName(),nameDetails.getChildNodes().item(i).getAttributes().item(a).getNodeValue());
                    }
                }
                //check "Name" has child nodes are not
                if(nameDetails.getChildNodes().item(i).hasChildNodes())
                {
                    String d =null;
                    //No of child nodes "Name" Has that is no. of NameValue
                    for (int a=0;a<nameDetails.getChildNodes().item(i).getChildNodes().getLength();a++)
                    {
                        //No.of Childs Nodes NameValue has that is fName,lName,etc,.
                        for(int b=0;b<nameDetails.getChildNodes().item(i).getChildNodes().item(a).getChildNodes().getLength();b++)
                        {       Map.put(nameDetails.getChildNodes().item(i).getChildNodes().item(a).getChildNodes().item(b).getNodeName(),nameDetails.getChildNodes().item(i).getChildNodes().item(a).getChildNodes().item(b).getChildNodes().item(0).getNodeValue());
                            }       StringClass.setValuesToDB(nameDetails.getNodeName(), Map);

                    }
                }
            }
        }
        return Map;
    }

現在這種情況下的問題是我們需要存儲多個值

    <OriginalScriptName>حسن ظاهرعويس</OriginalScriptName> 
    <OriginalScriptName>ハッサン・ダヒル・アウェイス</OriginalScriptName> 
    <OriginalScriptName>アウェス、ハッサン・ダヒル</OriginalScriptName> 
    <OriginalScriptName>ウワイス、ハッサン・ターヒル</OriginalScriptName> 

轉換為以逗號分隔的單值

    حسن ظاهرعويس,ハッサン・ダヒル・アウェイス,アウェス、ハッサン・ダヒル,ウワイス、ハッサン・ターヒル

進入map.so,以便在插入db時可以獲取map值。

  Map.get("OriginalScriptName","حسن ظاهرعويس,ハッサン・ダヒル・アウェイス,アウェス、ハッサン・ダヒル,ウワイス、ハッサン・ターヒル")

   i.e., Map.get("OriginalScriptName",value)
   let value = ,ハッサン・ダヒル・アウェイス,アウェス、ハッサン・ダヒル,ウワイス、ハッサン・ターヒル

我已經使用xpath創建了一個解決方案。基於您的xml創建一個Java prog。 如果xml更改,則此編將無法工作。 另一件事:您的xml應該以

 <?xml version="1.0" encoding="UTF-8"?>

因為您的xml包含除英語以外的其他字符集

例如:

<?xml version="1.0" encoding="UTF-8"?>
<Name NameType="Primary Name">
<NameValue>
   <FirstName>Hassan</FirstName> 
   <MiddleName>Dahir</MiddleName> 
   <Surname>Aweys</Surname> 
   <OriginalScriptName>حسن ظاهرعويس</OriginalScriptName> 
   <OriginalScriptName>ハッサン・ダヒル・アウェイス</OriginalScriptName> 
   <OriginalScriptName>アウェス、ハッサン・ダヒル</OriginalScriptName> 
   <OriginalScriptName>ウワイス、ハッサン・ターヒル</OriginalScriptName> 
</NameValue>
</Name>

這是程序:

package com.xxxxx;

import org.w3c.dom.*;

import javax.xml.parsers.*;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import java.io.*;
import java.util.HashMap;
public class ReadXMLFileSax {
      public static void main(String argv[]) {
    try {

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new File("D:\\xxxx.xml"));

    Element root = document.getDocumentElement();

    XPath xPath = XPathFactory.newInstance().newXPath();
    NodeList nodes = (NodeList)xPath.evaluate("/Name[@NameType='Primary Name']/NameValue/OriginalScriptName",
            document.getDocumentElement(), XPathConstants.NODESET);
    String OriginalScriptName = "";
    HashMap<String, String> Map = new HashMap<String, String>();
    for (int i = 0; i < nodes.getLength(); ++i) {
        Element e = (Element) nodes.item(i);
      //  System.out.println(e.getTextContent());
        OriginalScriptName = OriginalScriptName+","+e.getTextContent();
    }
    System.out.println("OriginalScriptName "+OriginalScriptName.substring(1));
    Map.put("OriginalScriptName", OriginalScriptName.substring(1));
    }catch (Exception e) {
    e.printStackTrace();
    }

      }
    }

程序輸出如下:

OriginalScriptName حسن ظاهرعويس,ハッサン・ダヒル・アウェイス,アウェス、ハッサン・ダヒル,ウワイス、ハッサン・ターヒル

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM