我正在使用 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"
}
]
看起来您正在尝试将 XML 扁平化为简单的非规范化记录,然后将这些记录转换为 Java 映射。
只有当(如您的示例中)您有一个层次结构,其中没有元素是多个一对多关系的所有者时,这种扁平化才有可能。例如像
这样的结构<book>
<author>John</author>
<author>Jane</author>
<editor>Mary</editor>
<editor>Mark</editor>
</book>
无法使用这种方法进行展平。这是相关的,因为您似乎正在编写应该与任何 XML 词汇表一起使用的代码,并且您未能指定它在一般情况下应该执行的操作。
在尝试编写代码之前,您需要仔细考虑一下您的需求。