当前位置: 首页 > 知识库问答 >
问题:

将XML解析为HashmapJava

裴俊雅
2023-03-14

我有一些信息存储在XML中,我需要解析XML并将一些值存储在Hashmap中。以下是XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<section ID="1">
    <Room>Room1</Room>
    <Capactiy>25</Capactiy>
    <Approval_Mode>personally</Approval_Mode>
    <Building>Building1</Building>
    <Address>Streer, 1. Stock, links</Address>
    <Room_Number>ZA0115</Room_Number>
    <CoordLt>16.412094</CoordLt>
    <CoordLn>48.19719</CoordLn>
</section>
<section ID="2">
    <Room>Room2</Room>
    <Capactiy>120</Capactiy>
    <Institute>E401</Institute>
    <Approval_Mode>personally</Approval_Mode>
    <Building>Building2</Building>
    <Address>Street 2, Building2, Stiege 7, 1.Stock</Address>
    <Room_Number>AH0105</Room_Number>
    <CoordLt>16.369865</CoordLt>
    <CoordLn>48.199006</CoordLn>
</section>
----

我想要的关键是:Room1和值:16.412094,48.19719(例如为部分ID=1)

这是第一部分的示例。我有100多个部分,所以我想像我在第一个示例中解释的那样为每个部分存储键和值。

输出为:

房间1: 16.412094,48.19719;房间2: 16.369865,48.199006;

房间3:16,48。房间100:16,49;

有人能帮我吗?

这是我的代码:

import java.io.File; 
import java.sql.ResultSet;
import java.util.HashMap; 
import org.xml.sax.*; 
import org.xml.sax.helpers.DefaultHandler; 
import javax.xml.parsers.SAXParserFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 

public class XML extends DefaultHandler  
{ 
static HashMap<StringBuffer, String> hashMap; 
String elementName; 
StringBuffer elementValue;
private HashMap<String, String> newMap; 
public static void main(String[] args) 
{ 
DefaultHandler handler = new XML(); 
SAXParserFactory factory = SAXParserFactory.newInstance(); 
try 
{ 
hashMap = new HashMap<StringBuffer, String>(); 
//out = new OutputStreamWriter(System.out, "UTF8"); 
SAXParser saxParser = factory.newSAXParser(); 
saxParser.parse(new File("xml1.xml"), handler); 
System.out.println(hashMap); 
} 
catch(Throwable t) 
{ 
t.printStackTrace(); 
} 
System.exit(0); 
} 


public void startElement(String namespaceURI, String sName, String qName, Attributes    attrs) 
throws SAXException 
{ 
String eName = sName; 
if("".equals(eName)) eName = qName;

elementName = eName; 
if(attrs != null) 
{ 
for(int i = 0; i < attrs.getLength(); i++) 
{ 
String aName = attrs.getLocalName(i); 
if("".equals(aName)) aName = attrs.getQName(i); 

} 
} 
} 

public void endElement(String namespaceURI, String sName, String qName) 
throws SAXException 

{ 
String eName = sName; 
if("".equals(eName)) eName = qName; 

if(eName.equals(elementName)) 

hashMap.put(elementValue,""+ elementName );
elementValue = null;  
} 

public void characters(char[] ch, int start, int length) 
throws SAXException 
{ 
String str = new String(ch, start, length); 
if(elementValue == null) 
elementValue = new StringBuffer(str); 
else 
elementValue.append(str); 
} 
}

使用此代码,我无法获得所需的输出。输出为:房间=房间1,容量=25。。。。。。

共有2个答案

酆晔
2023-03-14

如果您使用这个xslt(可以在Java中完成)转换XML,您将获得所需的输出,如果sle知道如何在hashmap中加载,您就可以了。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" indent="no" omit-xml-declaration ="yes" />

    <xsl:template match="/sections">
            <xsl:apply-templates select="section"/>
    </xsl:template>

  <xsl:template match="section" xml:space="default">
    <xsl:apply-templates select="Room"/>
    <xsl:text>:</xsl:text>
    <xsl:apply-templates select="CoordLt" />
    <xsl:text>,</xsl:text>
    <xsl:apply-templates select="CoordLn"/>
    <xsl:text>;</xsl:text>
  </xsl:template>

</xsl:stylesheet>
蒋啸
2023-03-14

假设您的xml文件是"c:/test.xml"

然后使用以下代码以如下格式读取并放入哈希映射中,如您所说

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.spi.DirStateFactory.Result;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class xml {
    public static void main(String[] args) 
    {
        HashMap<String,String>hMap=new HashMap<String, String>();
        File file=new File("c:/test.xml");

        if(file.exists())
        {
           DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
            try
            {
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document document=builder.parse(file);
                Element documentElement=document.getDocumentElement();
                NodeList sList=documentElement.getElementsByTagName("section");
                if (sList != null && sList.getLength() > 0)
                {
                    for (int i = 0; i < sList.getLength(); i++)
                    {
                        Node node = sList.item(i);
                        if(node.getNodeType()==Node.ELEMENT_NODE)
                        {
                            Element e = (Element) node;

                            NodeList nodeList = e.getElementsByTagName("Room");

                            String roomName= nodeList.item(0).getChildNodes().item(0)
                                            .getNodeValue();


                             nodeList = e.getElementsByTagName("CoordLt");
                            String coordValues= nodeList.item(0).getChildNodes().item(0)
                                            .getNodeValue();


                            nodeList = e.getElementsByTagName("CoordLn");
                            coordValues=coordValues+","+ nodeList.item(0).getChildNodes().item(0)
                                            .getNodeValue();
                            hMap.put(roomName, coordValues);
                        }
                    }
                }
            } catch(Exception e){
                System.out.println("exception occured");
            }
        }else
        {
            System.out.println("File not exists");
        }

    }
}
 类似资料:
  • 问题内容: 我有一个XML文件,例如 如何将其解析为JSON结构文件? 问题答案: 对于一个简单的解决方案,我建议使用Jackson库,它是一个Java库,用于生成和读取带有XML扩展名的JSON,因为它只需几行简单的代码就可以将任意复杂的XML转换为JSON。 input.xml Java代码: 该演示使用Jackson 1.7.7 (较新的1.7.8也可以使用),Jackson XML Dat

  • 问题内容: 我有一个要解析的xml示例 我想从此xml中编写一个方法,将该方法解析为键是字符串且值是字符串列表的hashmap。 例如:键“ detail a” value = {“ detail a的属性1”,“ detail a的属性2”,“ detail a的属性3”} 等等.. 做这个的最好方式是什么 ?因为我很困惑:\ 我走了这么远才能尝试打印detail-a和detail-b,但我还是

  • 问题内容: 我有一个看起来像这样的XML文件: 我想将其读入python对象,类似于字典列表。因为标记是绝对固定的,所以我很想使用正则表达式(我非常擅长使用那些正则表达式)。但是,我想我会检查是否有人知道如何在此处轻松避免使用正则表达式。我对SAX或其他解析没有太多经验,但是我愿意学习。 我期待向您展示如何在不使用regexes的情况下快速完成此操作。谢谢你的帮助! 问题答案: 如果您认为正则表达

  • 问题内容: 因此,我坐在这里与Google Geocoder一起,后者通过’GOOGLE_URL / xml?address = input&sensor = false’返回XML。我需要使用Java来获取它,并将其解析为JSON对象并继续发送。 我将如何去做?(不,这不是家庭作业)请注意,最好在标准库中完成。目前,我正在尝试确定是否可以使用例如SAX来完成。 问题答案: 这是一个工作示例,显示

  • 问题内容: 我正在尝试将以下feed解析为python中的ElementTree:“ http://smarkets.s3.amazonaws.com/oddsfeed.xml ”(警告大文件) 到目前为止,这是我尝试过的: 但是它似乎只是挂在上面,也许是无限地??(我知道这是一个大文件,但与我解析的其他非压缩提要相比似乎太长了,而这个大文件首先会扼杀gzip压缩带来的任何带宽增长)。 接下来我尝

  • 问题内容: Goodreads网站具有用于访问用户“货架”的API:https : //www.goodreads.com/review/list/20990068.xml? key=nGvCqaQ6tn9w4HNpW8kquw &v=2&shelf=toread 它返回XML。我正在尝试创建一个django项目,该项目通过此API在书架上显示书籍。我正在寻找一种方法(或者是否有比该方法更好的方法