XML文件转换成 HTML

本文介绍了一个具体的案例,演示如何使用Java编程将XML文件转换为HTML格式,并通过XSL样式表定义转换规则。此过程涉及XML文件读取、XSLT转换及HTML文件生成。

package com.itheima.xml;

import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class TextXMLToHTML {
/**
* 将XML转换成HTML
* @throws Exception
*/
public static void translate() throws Exception{
//创建XML的文件输入流
FileInputStream fis=new FileInputStream("F:/123.xml");
Source source=new StreamSource(fis);

//创建XSL文件的输入流
FileInputStream fis1=new FileInputStream("F:/123.xsl");
Source template=new StreamSource(fis1);

PrintStream stm=new PrintStream(new File("F:/123.html"));
//讲转换后的结果输出到 stm 中即 F:\123.html
Result result=new StreamResult(stm);
//根据XSL文件创建准个转换对象
Transformer transformer=TransformerFactory.newInstance().newTransformer(template);
//处理xml进行交换
transformer.transform(source, result);
//关闭文件流
fis1.close();
fis.close();
}

public static void main(String[] args){
try {
translate();
} catch (Exception e) {
System.out.println("XML转换成HTML失败:"+e.getMessage());
}
}
}



F:/123.xml

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<employees>
<employee-list>
<employee>
<id>001</id>
<name>李达</name>
<gender>男</gender>
<address>北京海淀</address>
</employee>
<employee>
<id>002</id>
<name>赵超</name>
<gender>男</gender>
<address>上海黄浦</address>
</employee>
<employee>
<id>003</id>
<name>张云</name>
<gender>女</gender>
<address>山东济南</address>
</employee>
</employee-list>
</employees>


F:/123.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>员工信息</title>
</head>

<body>
<table width="800px" border="1" bordercolor="#000000" style="border-collapse:collapse">
<tr>
<td align="center">编号</td>
<td align="center">姓名</td>
<td align="center">性别</td>
<td align="center">地址</td>
</tr>
<xsl:for-each select="employees/employee-list/employee">
<tr>
<td align="center"><xsl:value-of select="id"/></td>
<td align="center"><xsl:value-of select="name"/></td>
<td align="center"><xsl:value-of select="gender"/></td>
<td align="center"><xsl:value-of select="address"/></td>
</tr>
</xsl:for-each>

</table>
</body>
</html>

</xsl:template>
</xsl:stylesheet>


//运行后在F:/生成了123.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>员工信息</title>
</head>
<body>
<table width="800px" border="1" bordercolor="#000000" style="border-collapse:collapse">
<tr>
<td align="center">编号</td><td align="center">姓名</td><td align="center">性别</td><td align="center">地址</td>
</tr>
<tr>
<td align="center">001</td><td align="center">李达</td><td align="center">男</td><td align="center">北京海淀</td>
</tr>
<tr>
<td align="center">002</td><td align="center">赵超</td><td align="center">男</td><td align="center">上海黄浦</td>
</tr>
<tr>
<td align="center">003</td><td align="center">张云</td><td align="center">女</td><td align="center">山东济南</td>
</tr>
</table>
</body>
</html>
<think>我们正在处理用户的问题:将XML文件转换H5文件的方法。注意,这里的H5文件通常指的是HDF5格式的文件(Hierarchical Data Format version 5),而不是HTML5。 用户提供的引用内容中并没有直接关于XML转HDF5的信息。不过,我们可以根据常见的数据处理流程提供解决方法。 常见的场景可能是:用户有XML格式标注的数据(例如PASCAL VOC格式的标注文件),想要转换HDF5格式以便于深度学习框架(如TensorFlow、Keras)高效读取。 转换步骤通常包括: 1. 解析XML文件,提取所需的数据(如图像的路径、目标检测的边界框、类别等)。 2. 将解析后的数据整理适合存储的结构,比如数组、字典等。 3. 使用HDF5库(如h5py)将数据写入HDF5文件。 以下是一个示例代码,展示如何将XML标注文件(假设为VOC格式)转换HDF5文件。注意,这个示例假设每个XML文件对应一张图片,并且我们只存储边界框和标签信息,同时我们还需要图像数据本身(但用户问题只提到XML,所以可能需要根据实际情况调整)。 由于用户没有提供具体需求,我们假设用户想将每个XML文件中的标注信息(包括图像文件名、每个对象的边界框和类别)存入HDF5文件。同时,我们可能还需要将图像数据也存储进去,但这里我们先处理标注信息。 步骤: 1. 遍历XML文件目录,解析每个XML文件。 2. 提取图像文件名、图像尺寸以及每个对象的边界框(xmin, ymin, xmax, ymax)和类别名称。 3. 将每个图像的所有标注信息存储为一个结构化数组(或使用多个数组分别存储)。 4. 使用h5py创建一个HDF5文件,将标注信息写入。 注意:由于XML文件通常较小,而图像数据较大,所以如果要将图像数据也存入HDF5,则需要读取图像文件并存储为二进制数据。这里我们先处理标注信息。 示例代码(Python): 我们将使用xml.etree.ElementTree来解析XML,使用h5py来创建HDF5文件。 注意:以下代码需要根据实际XML结构进行调整(这里以PASCAL VOC为例)。 假设XML文件结构如下: <annotation> <filename>image.jpg</filename> <size> <width>800</width> <height>600</height> <depth>3</depth> </size> <object> <name>cat</name> <bndbox> <xmin>100</xmin> <ymin>200</ymin> <xmax>300</xmax> <ymax>400</ymax> </bndbox> </object> ... 可能有多个object </annotation> 我们的目标是将每个图像的信息存储为HDF5文件中的一个group(以图像文件名作为group名),并在group中存储: - 图像尺寸(作为属性或数据集) - 边界框(一个二维数组,每行是一个边界框[xmin, ymin, xmax, ymax]) - 类别(一个一维数组,每个元素是类别索引,或者一个字符串数组) 但是,由于边界框数量不固定,我们可以使用变长数组(HDF5支持)或固定大小(通过填充0)来存储。这里为了简单,我们使用固定大小(设定最大边界框数量)或者使用变长数组。 另一种方式是将所有图像的边界框信息存储在一个数据集里,但这样结构会复杂。所以我们采用每个图像一个group的方式。 考虑到HDF5不支持可变长度的字符串数组,我们可以将类别名称转换为固定长度的字符串,或者存储类别索引(需要预先定义类别映射表)。 以下是一个简单的示例代码,展示如何将单个XML文件的信息写入HDF5文件(假设我们处理多个XML文件,每个XML文件对应一个图像): 注意:由于代码较长,我们只展示关键步骤。 </think>将XML文件转换为H5文件(HDF5格式)通常涉及数据解析和格式转换。以下是完整方法和步骤: ### 方法概述 1. **解析XML数据**:读取XML文件内容并提取结构化数据 2. **数据预处理**:将XML数据转换为Python数据结构 3. **创建HDF5文件**:使用HDF5库存储结构化数据 4. **优化存储**:根据数据类型选择最佳存储方式 ### 完整实现代码(Python) ```python import xml.etree.ElementTree as ET import h5py import numpy as np def xml_to_h5(xml_path, h5_path): """ 将XML文件转换为HDF5格式 :param xml_path: XML文件路径 :param h5_path: 输出HDF5文件路径 """ # 解析XML tree = ET.parse(xml_path) root = tree.getroot() # 创建HDF5文件 with h5py.File(h5_path, 'w') as hf: # 存储元数据 metadata = { 'root_tag': root.tag, 'attributes': str(root.attrib) } hf.attrs.update(metadata) # 递归处理所有XML元素 def process_element(group, element): """递归处理XML节点""" # 创建与当前元素同名的分组 subgroup = group.create_group(element.tag) # 存储属性 if element.attrib: attrs = subgroup.create_group('@attributes') for k, v in element.attrib.items(): attrs.create_dataset(k, data=v) # 处理子元素 children = {} for child in element: if child.tag not in children: children[child.tag] = [] children[child.tag].append(child) # 存储内容和子元素 if element.text and element.text.strip(): subgroup.create_dataset('text', data=element.text.strip()) for tag, items in children.items(): if len(items) > 1: # 多个同类元素 group_list = [] for item in items: sub = process_element(subgroup, item) group_list.append(sub) else: # 单个元素 process_element(subgroup, items[0]) # 从根元素开始处理 process_element(hf, root) # 使用示例 xml_to_h5('input.xml', 'output.h5') ``` ### 关键步骤说明 1. **XML解析**: - 使用Python内置`xml.etree.ElementTree`解析XML - 递归遍历所有节点和属性(时间复杂度$O(n)$) 2. **HDF5结构设计**: ```plaintext / (根组) ├── @attributes (存储根元素属性) ├── element1 (子元素组) │ ├── @attributes │ ├── text (文本内容) │ └── child_element └── element2 ``` 3. **数据转换规则**: - 每个XML元素 → HDF5组(group) - 元素属性 → 组内的`@attributes`子组 - 元素文本内容 → 文本数据集(dataset) - 重复元素 → 数组存储 ### 使用场景 1. **大规模数据集存储**:适用于计算机视觉数据集(如PASCAL VOC转HDF5) 2. **科学计算**:存储结构化实验数据 3. **跨平台数据交换**:解决XML解析效率问题 ### 注意事项 1. 大数据集建议分块存储: ```python dset = hf.create_dataset("big_data", (1000,), chunks=(100,)) ``` 2. 复杂数据类型可使用复合类型: ```python dt = np.dtype([('name', 'S20'), ('value', 'f4')]) ``` 3. XML特性处理: - 命名空间:`{uri}tag`格式存储 - CDATA部分:保留原始文本内容 ### 替代方案 1. **XML→JSON→HDF5**: ```python import xmltodict with open('data.xml') as fd: doc = xmltodict.parse(fd.read()) # 再将dict转换为HDF5 ``` 2. **专用转换工具**: - `h5py` + `lxml`组合(处理更大XML文件) - Apache Spark XML数据源(分布式处理) > 提示:根据具体数据结构选择合适的转换策略,简单数据可直接映射,复杂嵌套数据建议保留原始层次结构[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值