【问题标题】:Getting XML number of nodes in a xml file with the same node name using DOM使用DOM获取具有相同节点名称的xml文件中的XML节点数
【发布时间】:2015-06-23 07:02:55
【问题描述】:

我需要解析一个 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中。这样我们可以在插入到db的同时获取map值。

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

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

【问题讨论】:

    标签: java xml parsing dom collections


    【解决方案1】:

    我已经使用 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 حسن ظاهرعويس,ハッサン・ダヒル・アウェイス,アウェス、ハッサン・ダヒル,ウワイス、ハッサン・ターヒル
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多