有这样一个需求,一个excel文件,里面描述了一个xml结构的文档。 我们需要做一个工具,读取excel内容并生成该结构的文件。 以何种形式保存该信息是本文讨论的关键。
举个例子,excel包含这些信息, 顺序和Level是决定最终样式的重要数据:
Level:1, company
Level:2, developer
Level:3, name, DevA
Level:3, age, 25
Level:2, tester
Level:3, name, QAB
生成后样式:
<company>
<developer>
<name>DevA</name>
<age>25</age>
</developer>
<tester>
<name>QAB</name>
<age>22</age>
</tester>
</company>
[前期封装]
我们可以视excel每一行数据(即xml中的每个节点)为一个对象,假设excel中只包含节点名和值信息,创建这样一个简单的对象。
public class Element {
private int level;
private String tagName;
private String value;
private ArrayList<Element> childElements = new ArrayList<Element>();
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public void addChildElement(Element e) {
childElements.add(e);
}
public List getChildElements() {
return childElements;
}
}
[读取Elements]
我们可以逐行读取Element,可是新读到的Element只包含Level信息以及其自身的内容。我们将以何种方式存储读取过的对象呢?而且我们需要将读取到的节点对象,与当前的节点形成正确的父子关系。
若仅仅用,读一行,加为子节点的手段。我们加developer为company的子节点, developer再将name, age加为自己的子节点。可是当我们读到tester这行时,它的谁的子节点,如果没有好的结构保存已读出的数据,我们将很难判断。
其实,我们不难发现,xml结构的数据,我们可以用树图来表示。

保存树的方法有很多,由于本人算法数据结构学的都不咋地,就用最简单的HashMap来保存。
呵呵,HashMap其实也是可以保存树结构的,尽管傻些,不过针对这个问题,还挺好用。
我们先来探讨用什么作为HashMap的Key。值很简单,则为各个节点对象。
company的key可以简单的以0表示,若有一个子节点则在后面加0,若该节点又有一个子节点则最后的数字加1,注意这里就不是加一位了,以此类推。
用图表示如下:

若tester下面还有子节点则,标位为011。
下面我们就可以遍历excel文件中的内容,并保存在HashMap中。
先设一个rootElement,初始position为"0"。
Element rootElement;
String position = "0"
由于实际项目并不是java写的,个别处用伪代码
while (excel中有数据) {
// 读取一条数据,并生成Element
Element currElement = readElement(execelFile, line)
// 获取Level等级
level = currElement.getLevel();
// 若 level 为 1,说明此Element为root
If (level == 1) {
rootElement = currElement;
} else {
// 若Level大于当前position的长度,则视为新读到的Element是当前position节点的子节点
if (level > position.length) {
Element paramElement = elementMap.get(position);
paramElement.addChildElement(currElement);
position = position + "0";
// 若Level等于当前position长度,则视为与当前position节点有相同的父节点。
} else if (level == position.length) {
Element paramElement = elementMap.get(position.subString(0, level - 1));
paramElement.addChildElement(currElement);
position = position.subString(0, position.length - 1)
+ (Integer.parseInt(position.subString(position.length - 1))) + 1);
// 若Level小于当前position长度,则视为跳回到Level处,与其有相同的父节点。 Position为跳回Level处再加1.
} else {
Element paramElement = elementMap.get(position.subString(0, level - 1));
paramElement.addChildElement(currElement);
String newPosition = position.subString(0, level));
position = newPosition.subString(0, newPosition.length - 1)
+ (Integer.parseInt(newPosition.subString(newPositionion.length - 1))) + 1);
}
}
// 将当前的Element加入到HashMap中
elementMap.put(position, currElement);
line++;
}
以上代码,我们通过HashMap作为树结构的保存方式,生成了所有Elements的父子关系。我们可以通过获取rootElement的所有子节点进行验证。
后面的工作,我们就可以从rootElements开始遍历子节点,去生成文件了,由于不是本文重点,略去。
Hope it can relax your eyes : )


- 大小: 8.6 KB

- 大小: 9.1 KB

- 大小: 67.7 KB
分享到:
相关推荐
5. **完整示例**:结合以上步骤,以下是一个完整的C#程序,它读取Excel文件并生成XML文件: ```csharp using OfficeOpenXml; using System; using System.IO; using System.Xml; public class Program { public ...
XPath是一种在XML文档中查找信息的语言,而LINQ to XML提供了更面向对象的查询方式。根据XML文件结构,你可以选择合适的方法来提取所需数据。 例如,如果XML文件包含如下结构: ```xml <name>Item1 <value>...
5. **数据转换**:从Excel读取的数据被填充到DataTable后,可以使用DataTable的内置方法,如`WriteXml()`,将数据写入XML文件。这个方法会生成一个符合XML Schema(XSD)的XML文件,其中包含了DataTable的所有行和列...
- 将数据对象转换为XML字符串,可以使用DocumentBuilderFactory和DocumentBuilder创建XML文档对象,然后使用TransformerFactory和Transformer将XML Document对象转换为字符串。 8. **存储XML文件**: - 生成的XML...
DOM将整个XML文档加载到内存中,适合小型文件;SAX事件驱动,逐行解析,适用于大文件;而StAX则提供了一个流式解析器,允许在读取XML时只处理必要的部分,内存消耗较低,非常适合处理大规模数据。 博客中提到的工具...
3. 使用DOM4J库创建XML文档结构。 4. 将Excel数据写入XML文件。 通过这些步骤,你可以实现从Excel文件读取数据并将其转换为XML格式的功能。这在数据迁移、数据交换或数据分析等场景中非常有用。
以下是一个简单的例子,展示如何创建一个XML文档并添加Excel数据: ```java import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; ...
在给定的描述中,我们看到如何从 QTP 的 XML 结果文件中提取数据,并将这些数据汇总到一个 Excel 文件中。 首先,我们需要了解如何读取 XML 文件。在示例代码中,使用了 `GetXmlAttribute` 函数来获取特定 XML 路径...
以上代码实现了从XML文件解析数据,并使用Python生成一个包含彩色效果的Excel文档。在实际应用中,你可以根据需求调整数据处理和样式设置部分,以满足特定的业务需求。例如,可以根据XML元素的属性或文本内容来决定...
创建XML文档结构,通常以根元素开始,然后逐行添加数据: ```ruby xml = Nokogiri::XML::Builder.new do |xml| xml.root { |root| data.each do |row| root.row do |row_node| row.each { |key, value| row_...
- **Element**: 用于表示XML文档中的元素。 - **Attribute**: 表示XML元素的属性。 - **Document**: 代表整个XML文档。 示例代码中使用了JDOM来构建一个XML文档,具体步骤包括: 1. 创建根元素`nikuDataBus`。 2. ...
3. **XML 文件与Word/Excel 文档**:描述中提到了从XML文件中读取数据来生成文档,这可能意味着XML被用作数据存储格式,然后通过POI转换为Word或Excel格式。XML可以更方便地进行数据操作和格式化,然后利用POI将其...
首先创建XML文档对象,然后填充必要的元素和属性。可以使用`XmlWriter`类来写入XML结构。 3. 应用样式和格式:如果需要对Excel文件应用样式,如字体、颜色、对齐方式等,你需要创建`<style>`元素,并为每个需要样式...
// 假设我们有一个Map, String> excelData存储了从Excel读取的数据 Map, String> excelData = ...; for (Map.Entry, String> entry : excelData.entrySet()) { String key = entry.getKey(); String value = entry...
与DOM(Document Object Model)解析器不同,SAX不需要一次性加载整个XML文档到内存,而是逐行读取,节省了内存资源。对于大文件,SAX更适合。以下是使用Python的`xml.sax`模块进行SAX解析的基本步骤: 1. 定义一个...
在这个场景中,我们将探讨如何使用Kettle将XML文档转换为数据表结构。 XML是一种通用的数据交换格式,广泛用于存储和传输结构化信息。然而,很多数据库和分析工具更倾向于以表格形式存储数据。Kettle提供了解决这个...
本文将深入讲解如何使用SAX(Simple API for XML)解析XML文档,并将解析结果导出到Excel文件中。SAX是一种事件驱动的解析方式,相比DOM(Document Object Model)解析,它更节省内存,适用于处理大型XML文件。 ...
下面是一个简单的例子,展示了如何使用DOM4J创建XML文档: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; Document document = DocumentHelper.createDocument...
4. **创建XML文档**: 在读取Excel数据之后,你需要创建一个XMLDocument对象来存储数据。 ```csharp XmlDocument xmlDoc = new XmlDocument(); ``` 5. **构建XML结构**: 使用`XmlElement`和`XmlDocument....
总的来说,C#从Excel读取数据是一项常用且实用的技能,结合适当的库和工具,你可以高效地处理Excel数据,并生成各种报表。无论是学习还是工作中,熟练掌握这部分知识都将大大提高你的开发效率。