当前位置: 首页 > 面试题库 >

如何将xml解析为hashmap?

卫景明
2023-03-14
问题内容

我有一个要解析的xml示例

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

<Details>
    <detail-a>

        <detail> attribute 1 of detail a </detail>
        <detail> attribute 2 of detail a </detail>
        <detail> attribute 3 of detail a </detail>

    </detail-a>

    <detail-b>
        <detail> attribute 1 of detail b </detail>
        <detail> attribute 2 of detail b </detail>

    </detail-b>


</Details>

我想从此xml中编写一个方法,将该方法解析为键是字符串且值是字符串列表的hashmap。

例如:键“ detail a” value = {“ detail a的属性1”,“ detail a的属性2”,“ detail a的属性3”}

等等..

做这个的最好方式是什么 ?因为我很困惑:\

我走了这么远才能尝试打印detail-a和detail-b,但我还是空白…

public static void main(String[] args) {
    // TODO Auto-generated method stub

    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

        DocumentBuilder builder;
        try {
            builder = factory.newDocumentBuilder();
            File f= new File("src/Details.xml");
            Document doc=builder.parse(f);
            Element root=doc.getDocumentElement();
            NodeList children=root.getChildNodes();
            for(int i=0;i<children.getLength();i++)
            {
                Node child=children.item(i);
                if (child instanceof Element)
                {
                    Element childElement=(Element) child;
                    Text textNode=(Text)childElement.getFirstChild();
                    String text=textNode.getData().trim();
                    System.out.println(text);

                }
            }

        } catch (ParserConfigurationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();   
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

问题答案:

使用JAXB从读取xml并保存为自定义对象。

自定义对象类:

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "Details")
@XmlType(propOrder = { "detailA", "detailB" })
public class Details {
    private List<String> detailA;
    private List<String> detailB;

    public void setDetailA(List<String> detailA) {
        this.detailA = detailA;
    }

    @XmlElementWrapper(name = "detail-a")
    @XmlElement(name = "detail")
    public List<String> getDetailA() {
        return detailA;
    }

    public void setDetailB(List<String> detailB) {
        this.detailB = detailB;
    }

    @XmlElementWrapper(name = "detail-b")
    @XmlElement(name = "detail")
    public List<String> getDetailB() {
        return detailB;
    }
}

将数据从xml中提取到对象中,然后根据需要将内容添加到地图中:

public static void main(String[] args) throws JAXBException, FileNotFoundException {
    System.out.println("Output from our XML File: ");
    JAXBContext context = JAXBContext.newInstance(Details.class);
    Unmarshaller um = context.createUnmarshaller();
    Details details = (Details)um.unmarshal(new FileReader("details.xml"));
    List<String> detailA = details.getDetailA();
    List<String> detailB = details.getDetailB();

    Map<String, String[]> map = new HashMap<String, String[]>();
    map.put("detail-a", detailA.toArray(new String[detailA.size()]));
    map.put("detail-b", detailB.toArray(new String[detailB.size()]));


    for (Map.Entry<String, String[]> entry : map.entrySet()) {
        //key "detail a" value={"attribute 1 of detail a","attribute 2 of detail a","attribute 3 of detail a"}
        System.out.print("Key \"" +entry.getKey()+"\" value={");
        for(int i=0;i<entry.getValue().length;i++){
            if(i!=entry.getValue().length-1){
                System.out.print("\""+entry.getValue()[i]+"\",");
            }
            else{
                System.out.print("\""+entry.getValue()[i]+"\"}");
            }
        }
        System.out.println();
    }
}

输出将是:

XML文件的输出: 
关键字“ detail-a”值= {“详细信息a的属性1”,“详细信息a的属性2”,“详细信息a的属性3”}
键“ detail-b”值= {“详细信息b的属性1”,“详细信息b的属性2”}

注意:这仅适用于您在问题中作为输入提供的xml,如果您需要添加诸如此类的更多详细信息detail-c,则还必须在自定义对象中定义它们。

使用的XML:

<?xml version="1.0" encoding="utf-8"?>
<Details>
    <detail-a>
        <detail>attribute 1 of detail a</detail>
        <detail>attribute 2 of detail a</detail>
        <detail>attribute 3 of detail a</detail>
    </detail-a>
    <detail-b>
        <detail>attribute 1 of detail b</detail>
        <detail>attribute 2 of detail b</detail>
    </detail-b>
</Details>


 类似资料:
  • 我有一些信息存储在XML中,我需要解析XML并将一些值存储在Hashmap中。以下是XML: 我想要的关键是:Room1和值:16.412094,48.19719(例如为部分ID=1) 这是第一部分的示例。我有100多个部分,所以我想像我在第一个示例中解释的那样为每个部分存储键和值。 输出为: 房间1: 16.412094,48.19719;房间2: 16.369865,48.199006; 房间

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

  • 问题内容: 如何解析包含数据的XML 我们如何解析xml并获取包含在???中的数据? 问题答案: (http://www.java2s.com/Code/Java/XML/GetcharacterdataCDATAfromxmldocument.htm)

  • 我得到的错误是:无法将java.lang.String实例反序列化出START_OBJECT令牌 如何将xml元素反序列化更正为基元类型?

  • 我正在尝试将JSON转换为GSON,我不确定这是最好的结构。 所有响应都由代码、消息和数据结构组成。但数据的内部结构可能会有所不同。 这是我的回应对象

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