如何使用 XSD 解析嵌套 XML 并在 Java 中创建结构化的 Hashmap 列表

问题描述 投票:0回答:1

我正在使用 Java 来处理 XML 数据。 我的目标是将嵌套的 XML 文件(带有关联的 XSD)转换为 Hashmap 列表,其中每个 HashMap 代表一行数据,其中 XML 标记名称作为列名称,值作为相应的数据。

我尝试使用 Java 的 DOM 解析器(DocumentBuilderFactory 和 DocumentBuilder)处理 XML。

我的代码迭代 XML 文档中的所有节点 (nodeList)。 对于每个元素节点,我检查并存储所有属性。 然后,我迭代子节点,提取标签名称和文本内容以构建表示单个数据行的 HashMap (currentRecord)。 我维护一个recordList来存储完成的HashMap。

    for (int i = 0; i < nodeList.getLength(); i++) { 
        Node currentNode = nodeList.item(i); 

        if (currentNode.getNodeType() == Node.ELEMENT_NODE) { 
        Element currentElement = (Element) currentNode; 

        // Check if there are attributes, if yes, add them to currentRecord map 
        NamedNodeMap attributes = currentElement.getAttributes(); 
        for (int k = 0; k < attributes.getLength(); k++) { 
            Node attribute = attributes.item(k); 
            if (attribute.getNodeValue() != null && !attribute.getNodeName().equals("xmlns:xsi")) { 
                currentRecord.put(attribute.getNodeName(), attribute.getNodeValue()); 
            } 
        } 

        NodeList childNodes = currentElement.getChildNodes(); 
        for (int j = 0; j < childNodes.getLength(); j++) { 
            Node childNode = childNodes.item(j); 
            if (childNode.getNodeType() == Node.ELEMENT_NODE) { 
                Element childElement = (Element) childNode; 
                String nodeName = childElement.getNodeName(); 
                String nodeValue = childElement.getTextContent(); 

                // Replace the same tag value. 
                if (nodeValue != null && !nodeValue.contains("\n")) { 
                    currentRecord.put(nodeName, nodeValue); 
                } 
            } 
        } 
        recordList.add(new HashMap<>(currentRecord)); 
    } 
    } 


XML Snippet:
<?xml version="1.0" encoding="UTF-8"?>
<Banks>
    <Bank>
        <Name>Goldman Sachs</Name>
        <Location>London</Location>
        <Clients>
            <Client>
                <ClientName>John Doe</ClientName>
                <AccountType>Savings</AccountType>
                <Services>
                    <Service>
                        <Type>Online Banking</Type>
                        <Status>Active</Status>
                    </Service>
                    <Service>
                        <Type>Investment</Type>
                        <Status>Inactive</Status>
                    </Service>
                </Services>
            </Client>
            <Client>
                <ClientName>Jane Smith</ClientName>
                <AccountType>Checking</AccountType>
                </Client>
            </Clients>
    </Bank>
</Banks>

Expected list of Hashmap example:
[
{
    "Name": "Goldman Sachs",
    "Location": "London",
    "ClientName": "John Doe",
    "AccountType": "Savings",
    "Type": "Online Banking",
    "Status": "Active"
}


{
    "Name": "Goldman Sachs",
    "Location": "London",
    "ClientName": "John Doe",
    "AccountType": "Savings",
    "Type": "Investment",
    "Status": "Inactive"
}
]
java xml parsing dom xsd
1个回答
0
投票

看起来您正在尝试将 XML 扁平化为简单的非规范化记录,然后将这些记录转换为 Java 映射。

只有当(如您的示例中)您有一个层次结构,其中没有元素是多个一对多关系的所有者时,这种扁平化才有可能。例如像

这样的结构
<book>
  <author>John</author>
  <author>Jane</author>
  <editor>Mary</editor>
  <editor>Mark</editor>
</book>

无法使用这种方法进行展平。这是相关的,因为您似乎正在编写应该与任何 XML 词汇表一起使用的代码,并且您未能指定它在一般情况下应该执行的操作。

在尝试编写代码之前,您需要仔细考虑一下您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.