XML文件生成读入

本文介绍使用DOM4J库解析与生成XML文件的方法,包括设置编码格式以确保跨平台兼容性的技巧,并提供示例代码说明如何读取XML文件中的特定元素。

http://tech.sina.com.cn/s/2004-10-29/1508450741.shtml

 

dom

jdom

sax

dom4j

 

//*****************************************************************

 

http://divine.javaeye.com/blog/734318

 

1.设置编码失效,打开时为ANSI 
OutputFormat format = OutputFormat.createPrettyPrint(); 
format.setEncoding("utf-8"); 
format.setSuppressDeclaration(true); 
format.setIndent(true); //设置是否缩进 
format.setIndent("   "); //以空格方式实现缩进 
format.setNewlines(true); //设置是否换行 
XMLWriter writer = new XMLWriter(new FileWriter(path+"1.xml"),format); 
writer.write(doc); 
writer.close(); 

2.设置编码成功 
XMLWriter writer = new XMLWriter(new FileOutputStream(path)); 
writer.write(doc); 
writer.close(); 


    在上面的代码中输出使用的是FileWriter对象进行文件的输出。这就是不能正确进行文件编码的原因所在,java中由Writer类继承下来的子类没有提供编码格式处理,所以dom4j也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存,在中文版的window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的,所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。

 

http://yyzhpq.javaeye.com/blog/307792

 

 

//*****************************************************************

 

 

dom4j解析

 

public void analysis(){

long lasting = System.currentTimeMillis();

try {

File f = new File(filePath);

SAXReader reader = new SAXReader();

Document doc = reader.read(f);

Element root = doc.getRootElement();

Element foo;

for(Iterator i = root.elementIterator("VALUE"); i.hasNext();){

foo = (Element) i.next();

System.out.print("车牌号码:" + foo.elementText("NO"));

System.out.println(" 车主地址:" + foo.elementText("ADDR"));

}

} catch (Exception e) {

e.printStackTrace();

}

System.out.println("Runtime:" + (System.currentTimeMillis() - lasting) + " ms");

}

 

 

 

dom4j生成

 

 

    public void createXML(String fileName) {

     try {

       org.dom4j.Document doc = org.dom4j.DocumentHelper.createDocument();doc.setXMLEncoding("GB18030");

       org.dom4j.Element root = doc.addElement("book");

       root.addAttribute("name", "我的图书");

       org.dom4j.Element childTmp;

       childTmp = root.addElement("price");

       childTmp.setText("21.22");

       org.dom4j.Element writer = root.addElement("author");

       writer.setText("李四");

       writer.addAttribute("ID", "001");

 

       org.dom4j.io.OutputFormat xmlFormat = org.dom4j.io.OutputFormat.createPrettyPrint();

       xmlFormat.setEncoding("GB18030");

            //使用FileOutputStream,而不是FileWriter,因为涉及到编码问题

            org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(new FileOutputStream(fileName),xmlFormat);

            xmlWriter.write(doc);

            xmlWriter.close();

        }catch (Exception e) {

         System.out.println(e);

        }

 

    }

 

 

//*****************************************************************

 

 

http://jiangsha.javaeye.com/blog/373831

 

 

<think>我们被要求回答关于在Python中读取XML文件的方法。根据用户的问题,我们需要介绍如何使用Python读取和解析XML文件。 在Python中,常用的处理XML的模块有xml.etree.ElementTree(简称ET)和minidom,此外还有第三方库如lxml。 由于标准库中的ElementTree足够使用且简单,我们将重点介绍它。 步骤: 1. 导入xml.etree.ElementTree模块。 2. 使用ElementTree.parse()加载XML文件,得到树(tree)对象。 3. 获取根元素(root)。 4. 遍历元素树,提取所需信息。 此外,我们也可以使用ElementTree.fromstring()解析字符串形式的XML。 同时,我们也可以简单提及minidom,因为它也是标准库的一部分,但通常ElementTree更推荐。 最后,生成相关问题。 注意:按照要求,行内数学表达式使用$...$,独立公式使用$$...$$(虽然这个问题可能用不到数学公式,但如果有变量名等,可以用行内格式),使用中文回答,并生成相关问题。 另外,引用标识:我们参考的文档或资源需要添加引用标识。这里我们可以引用Python官方文档,但由于用户没有提供具体引用,我们假设使用通用知识。如果有必要,我们可以添加一个引用标识指向Python官方文档。 开始回答:</think>### 如何在 Python 中读取和解析 XML 文件 在 Python 中处理 XML 文件主要使用标准库的 `xml.etree.ElementTree` 模块(简称 ET),它提供了轻量级且高效的 API。以下是具体方法和步骤: --- #### 1. **使用 ElementTree 解析 XML** ```python import xml.etree.ElementTree as ET # 解析 XML 文件 tree = ET.parse('data.xml') # 加载文件 root = tree.getroot() # 获取根元素 # 遍历子元素 for child in root: print(f"元素: {child.tag}, 属性: {child.attrib}") # 访问子元素的文本 for subchild in child: print(f" {subchild.tag}: {subchild.text}") ``` --- #### 2. **直接解析 XML 字符串** ```python xml_data = """ <bookstore> <book category="tech"> <title>Python编程</title> <price>89.00</price> </book> </bookstore> """ root = ET.fromstring(xml_data) # 从字符串解析 print(root.find('book/title').text) # 输出: Python编程 ``` --- #### 3. **使用 XPath 搜索元素** ```python # 查找所有书的标题 for title in root.findall(".//book/title"): print(title.text) # 查找特定属性的元素 tech_books = root.findall(".//book[@category='tech']") ``` --- #### 4. **修改并保存 XML** ```python # 修改元素文本 root.find("book/price").text = "99.00" # 添加新元素 new_book = ET.SubElement(root, "book", attrib={"category":"fiction"}) ET.SubElement(new_book, "title").text = "AI简史" # 保存修改 tree.write("updated_data.xml", encoding="utf-8", xml_declaration=True) ``` --- #### 5. **替代方案:xml.dom.minidom(适合小文件)** ```python from xml.dom import minidom dom = minidom.parse('data.xml') books = dom.getElementsByTagName("book") for book in books: title = book.getElementsByTagName("title")[0] print(title.firstChild.data) # 输出标题文本 ``` --- ### 关键注意事项 1. **编码问题** 确保 XML 文件声明编码(如 `<?xml version="1.0" encoding="UTF-8"?>`),读写时指定一致编码。 2. **命名空间处理** 若 XML 含命名空间(如 `<ns:tag>`),需在搜索时包含: ```python ET.register_namespace('ns', 'http://example.com') root.find("ns:book", {'ns': 'http://example.com'}) ``` 3. **大型文件优化** 用 `ET.iterparse()` 增量解析,避免内存溢出: ```python for event, elem in ET.iterparse('large.xml', events=("start", "end")): if event == "end" and elem.tag == "book": print(elem.find("title").text) elem.clear() # 释放内存 ``` > ⚠️ **安全警告**:避免使用 `xml.etree.ElementTree` 解析不可信 XML,可能存在[XXE 注入风险](https://docs.python.org/3/library/xml.html#xml-vulnerabilities)[^1]。推荐用 `defusedxml` 替代。 --- ### 完整示例 假设 `data.xml` 内容: ```xml <?xml version="1.0" encoding="UTF-8"?> <catalog> <book id="101"> <author>李沐</author> <title>深度学习实践</title> </book> </catalog> ``` 解析代码: ```python tree = ET.parse('data.xml') root = tree.getroot() book = root.find("book") print(f"ID: {book.get('id')}, 作者: {book.find('author').text}") # 输出: ID: 101, 作者: 李沐 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值