`

从excel中读取信息并生成XML结构的文档

阅读更多

有这样一个需求,一个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结构的数据,我们可以用树图来表示。

 

tree1

 

保存树的方法有很多,由于本人算法数据结构学的都不咋地,就用最简单的HashMap来保存。

呵呵,HashMap其实也是可以保存树结构的,尽管傻些,不过针对这个问题,还挺好用。

 

我们先来探讨用什么作为HashMap的Key。值很简单,则为各个节点对象。

company的key可以简单的以0表示,若有一个子节点则在后面加0,若该节点又有一个子节点则最后的数字加1,注意这里就不是加一位了,以此类推。

用图表示如下:

 

tree2

 

若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
2
3
分享到:
评论
4 楼 zhangjiajun1988 2010-10-12  
路过。。貌似不错。
3 楼 youyudetufei 2010-10-12  
[img][/img] 
not bad!thanks!
2 楼 michael.ma 2010-10-12  
yznxing 写道
就是把excel的层级关系表示出来啦~~~

<a>
<b>
</b>
</a>

这种形式的数据么?


恩啊,就是包含了层次与所属关系。我们实际要生成的是XML Schema,也是遵循XML结构的。里面一个Element信息老多了...最后那段java是通过脚本翻译过来的,脚本还算简洁,用Java译过来就丑陋些了

你有啥其他好方法直接回复,或者你自己写个帖子吧

1 楼 yznxing 2010-10-11  
就是把excel的层级关系表示出来啦~~~

<a>
<b>
</b>
</a>

这种形式的数据么?

相关推荐

    c#读取excel文件并生成xml文件

    5. **完整示例**:结合以上步骤,以下是一个完整的C#程序,它读取Excel文件并生成XML文件: ```csharp using OfficeOpenXml; using System; using System.IO; using System.Xml; public class Program { public ...

    读取目录中的xml文件并写入Excel

    XPath是一种在XML文档中查找信息的语言,而LINQ to XML提供了更面向对象的查询方式。根据XML文件结构,你可以选择合适的方法来提取所需数据。 例如,如果XML文件包含如下结构: ```xml &lt;name&gt;Item1 &lt;value&gt;...

    读取excel文档转为xml格式

    5. **数据转换**:从Excel读取的数据被填充到DataTable后,可以使用DataTable的内置方法,如`WriteXml()`,将数据写入XML文件。这个方法会生成一个符合XML Schema(XSD)的XML文件,其中包含了DataTable的所有行和列...

    android 读取Excel文件转成xml文件

    - 将数据对象转换为XML字符串,可以使用DocumentBuilderFactory和DocumentBuilder创建XML文档对象,然后使用TransformerFactory和Transformer将XML Document对象转换为字符串。 8. **存储XML文件**: - 生成的XML...

    以读取XML方式的大批量导入Excel

    DOM将整个XML文档加载到内存中,适合小型文件;SAX事件驱动,逐行解析,适用于大文件;而StAX则提供了一个流式解析器,允许在读取XML时只处理必要的部分,内存消耗较低,非常适合处理大规模数据。 博客中提到的工具...

    把Excel文件中的数据直接读取之后写到XML文件中

    3. 使用DOM4J库创建XML文档结构。 4. 将Excel数据写入XML文件。 通过这些步骤,你可以实现从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

    在给定的描述中,我们看到如何从 QTP 的 XML 结果文件中提取数据,并将这些数据汇总到一个 Excel 文件中。 首先,我们需要了解如何读取 XML 文件。在示例代码中,使用了 `GetXmlAttribute` 函数来获取特定 XML 路径...

    python解析xml生成excel文档

    以上代码实现了从XML文件解析数据,并使用Python生成一个包含彩色效果的Excel文档。在实际应用中,你可以根据需求调整数据处理和样式设置部分,以满足特定的业务需求。例如,可以根据XML元素的属性或文本内容来决定...

    用ruby读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_...

    java读取excel形成xml文件

    - **Element**: 用于表示XML文档中的元素。 - **Attribute**: 表示XML元素的属性。 - **Document**: 代表整个XML文档。 示例代码中使用了JDOM来构建一个XML文档,具体步骤包括: 1. 创建根元素`nikuDataBus`。 2. ...

    android中poi生成word文档和excel文档

    3. **XML 文件与Word/Excel 文档**:描述中提到了从XML文件中读取数据来生成文档,这可能意味着XML被用作数据存储格式,然后通过POI转换为Word或Excel格式。XML可以更方便地进行数据操作和格式化,然后利用POI将其...

    通过XML生成Excel文件示例

    首先创建XML文档对象,然后填充必要的元素和属性。可以使用`XmlWriter`类来写入XML结构。 3. 应用样式和格式:如果需要对Excel文件应用样式,如字体、颜色、对齐方式等,你需要创建`&lt;style&gt;`元素,并为每个需要样式...

    Java通过POI读取Excel遍历数据,批量生成word文档

    // 假设我们有一个Map, String&gt; excelData存储了从Excel读取的数据 Map, String&gt; excelData = ...; for (Map.Entry, String&gt; entry : excelData.entrySet()) { String key = entry.getKey(); String value = entry...

    读取xml导出为excel

    与DOM(Document Object Model)解析器不同,SAX不需要一次性加载整个XML文档到内存,而是逐行读取,节省了内存资源。对于大文件,SAX更适合。以下是使用Python的`xml.sax`模块进行SAX解析的基本步骤: 1. 定义一个...

    《使用kettle把XML文档转换成数据表结构》附件

    在这个场景中,我们将探讨如何使用Kettle将XML文档转换为数据表结构。 XML是一种通用的数据交换格式,广泛用于存储和传输结构化信息。然而,很多数据库和分析工具更倾向于以表格形式存储数据。Kettle提供了解决这个...

    Java解析XML文档(二):sax读取xml文件导出excel

    本文将深入讲解如何使用SAX(Simple API for XML)解析XML文档,并将解析结果导出到Excel文件中。SAX是一种事件驱动的解析方式,相比DOM(Document Object Model)解析,它更节省内存,适用于处理大型XML文件。 ...

    Excel2xml,excel文档解析

    下面是一个简单的例子,展示了如何使用DOM4J创建XML文档: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; Document document = DocumentHelper.createDocument...

    C#读取excel并转换成xml文件

    4. **创建XML文档**: 在读取Excel数据之后,你需要创建一个XMLDocument对象来存储数据。 ```csharp XmlDocument xmlDoc = new XmlDocument(); ``` 5. **构建XML结构**: 使用`XmlElement`和`XmlDocument....

    c#从Excel读取数据

    总的来说,C#从Excel读取数据是一项常用且实用的技能,结合适当的库和工具,你可以高效地处理Excel数据,并生成各种报表。无论是学习还是工作中,熟练掌握这部分知识都将大大提高你的开发效率。

Global site tag (gtag.js) - Google Analytics