精华内容
下载资源
问答
  • xml的学习和使用python解析读取xml文件
    千次阅读
    2021-12-14 10:05:38

    1. XML的介绍

    XML 指可扩展标记语言(EXtensible Markup Language)。

    和json类似也是用于存储和传输数据,还可以用作配置文件。

    类似于HTML超文本标记语言,但是HTML所有的标签都是预定义的,而xml的标签是自行定义。

    XML 和 HTML 为不同的目的而设计,HTML 旨在显示信息,而 XML 旨在传输信息。:

    XML 被设计用来传输和存储数据,其焦点是数据的内容。
    HTML 被设计用来显示数据,其焦点是数据的外观。

    所以对 XML 最好的描述是:

    XML 是独立于软件和硬件的信息传输工具。

    2.XML的树结构

    XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。 

    每一个元素有三个属性:tag、text、attrib

    比如下面例子中,note是根元素,他的tag就是note,attrib属性是id=1,没有文本节点,有四个子元素。

    <?xml version="1.0" encoding="UTF-8"?>
    <note id="1>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
    </note>

    第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言)。

    第二行描述文档的根元素(像在说:"本文档是一个便签")

    接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body),子元素只有文本内容,<note>元素拥有属性和元素内容。

    最后一行定义根元素的结尾:</note>

    父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞。所有的元素都可以有文本内容和属性(类似 HTML 中)。

    3.XML语法 

    在 HTML 中,某些元素不必有一个关闭标签;在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签。

    在 XML 中,XML 的属性值必须加引号。

    <note date="12/11/2007">
    <to>Tove</to>
    <from>Jani</from>
    </note>

    在 HTML 中,常会看到没有正确嵌套的元素;在 XML 中,所有元素都必须彼此正确地嵌套。

    <b><i>This text is bold and italic</i></b> 正确
    <b><i>This text is bold and italic</b></i> 错误

    XML 中的注释:<!-- This is a comment -->

    4.XML DOM

    DOM(Document Object Model 文档对象模型)定义了访问和操作文档的标准方法,把 XML 文档作为树结构来查看。

    所有元素可以通过 DOM 树来访问。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。

    4.1python解析xml例子:

    <?xml version="1.0" encoding="utf-8" ?>
    <!--this is a test about xml.-->
    <booklist type="science and engineering">
     <book category="math">
    	 <title>learning math</title>
    	 <author>张三</author>
    	 <pageNumber>561</pageNumber>
     </book>
     <book category="Python">
    	 <title>learning Python</title>
    	 <author>李四</author>
    	 <pageNumber>600</pageNumber>
     </book>
    </booklist>

    使用python脚本读取代码:

    import os
    from xml.dom.minidom import parse
    
    xml_file = r'D:\pythonProject\xml\book.xml'
    
        # print(xml_file)
    #获取 xml 文档对象
    domTree = parse(xml_file)
    #获得根节点
    rootNode = domTree.documentElement
    
    # print('显示xml文档内容')
    # print(rootNode.toxml())
    # print('*'*10)
    
    #判断根节点是否有属性
    if rootNode.hasAttribute('type'):
        print('根节点的的type属性为:',rootNode.getAttribute('type'))
    else:
        print('根节点没有属性')
    
    book=rootNode.getElementsByTagName('book')
    print('有%d个book节点'%len(book))
    
    print(rootNode.getElementsByTagName('title')[0].childNodes[0].nodeValue)
    print("rootNode.getElementsByTagName('title')[0] 是获取文档第一个title元素")
    print("childNodes[0]是‘title'元素的第一个子元素,也就是文本节点")
    print("nodeValue为获取节点的值")
    
    print('*'*10)
    
    for i in range(len(book)):
        print('\n显示第%d个book节点的内容:'%(i+1))
        print(rootNode.getElementsByTagName('book')[i].toxml())
        print()
        if rootNode.getElementsByTagName('book')[i].hasAttribute('category'):
                print('book节点的属性是:',book[i].getAttribute('category'))
            
        print('title的值:',book[i].getElementsByTagName('title')[0].childNodes[0].data)
        #从根节点写是print(rootNode.getElementsByTagName('book')[1].getElementsByTagName('title')[0].childNodes[0].data)
        
        print('author的值:',book[i].getElementsByTagName('author')[0].childNodes[0].data)
        #或者用childNodes[0].nodeValue
        # print('author的值:', book[i].getElementsByTagName('author')[0].childNodes[0].nodeValue)
        
        print('pageNumber的值:',book[i].getElementsByTagName('pageNumber')[0].childNodes[0].data)
        print('*' * 10)
    
    

    运行结果:

     其中需要注意的是即使 XML 文件只包含一个元素,也必须指定数组索引 [0]。这是因为getElementsByTagName() 方法返回的是一个数组。

    4.2python创建xml例子

    doc.writexml():生成xml文档,将创建的存在于内存中的xml文档写入本地硬盘中,这时才能看到新建的xml文档

    语法:
    writexml(file,indent=’’,addindent=’’,newl=’’,endocing=None)

    参数说明:
    file:要保存为的文件对象名
    indent:根节点的缩进方式
    allindent:子节点的缩进方式
    newl:针对新行,指明换行方式
    encoding:保存文件的编码方式

    import xml.dom.minidom
    
    #在内存中创建一个空的文档
    doc=xml.dom.minidom.Document()
    
    #创建根元素
    root=doc.createElement('booklist')
    # print('添加的xml标签为:',root.tagName)
    
    #设置根元素的属性
    root.setAttribute('type','science and engineering')
    
    #将根节点添加到文档对象中
    doc.appendChild(root)
    
    #创建子元素
    book=doc.createElement('book')
    #添加注释
    book.appendChild(doc.createComment('这是注释'))
    
    #设置子元素的属性
    book.setAttribute('category','math')
    
    #子元素中嵌套子元素,并添加文本节点
    title=doc.createElement('title')
    title.appendChild(doc.createTextNode('learning math'))
    author=doc.createElement('author')
    author.appendChild(doc.createTextNode('张三'))
    pageNumber=doc.createElement('pageNumber')
    pageNumber.appendChild(doc.createTextNode('561'))
    
    #将子元素添加到boot节点中
    book.appendChild(title)
    book.appendChild(author)
    book.appendChild(pageNumber)
    #将book节点添加到root根元素中
    root.appendChild(book)
    
    #创建子元素
    book=doc.createElement('book')
    #设置子元素的属性
    book.setAttribute('category','python')
    
    title=doc.createElement('title')
    title.appendChild(doc.createTextNode('learning python'))
    
    author=doc.createElement('author')
    author.appendChild(doc.createTextNode('李四'))
    pageNumber=doc.createElement('pageNumber')
    pageNumber.appendChild(doc.createTextNode('600'))
    
    #将子元素添加到boot节点中
    book.appendChild(title)
    book.appendChild(author)
    book.appendChild(pageNumber)
    #将book节点添加到root根元素中
    root.appendChild(book)
    
    print(root.toxml())
    
    fp= open(r'D:\pythonProject\xml\new.xml','w',encoding='utf-8')#需要指定utf-8的文件编码格式,不然notepad中显示十六进制
    doc.writexml(fp,indent='',addindent='\t',newl='\n',encoding='utf-8')
    fp.close()
    

    运行显示结果:

     4.3向xml中插入新的子元素

    import os
    import xml.dom.minidom
    
    from xml.dom.minidom import parse
    
    #对book.xml新增一个子元素english,并删除math元素
    xml_file = r'D:\pythonProject\xml\book.xml'
    
    # #拿到根节点
    domTree = parse(xml_file)
    rootNode = domTree.documentElement
    
    rootNode.removeChild(rootNode.getElementsByTagName('book')[0])
    
    print(rootNode.toxml())
    
    #在内存中创建一个空的文档
    doc=xml.dom.minidom.Document()
    
    book=doc.createElement('book')
    book.setAttribute('category','english')
    title=doc.createElement('title')
    title.appendChild(doc.createTextNode('learning english'))
    author=doc.createElement('author')
    author.appendChild(doc.createTextNode('王五'))
    pageNumber=doc.createElement('pageNumber')
    pageNumber.appendChild(doc.createTextNode('328'))
    
    book.appendChild(title)
    book.appendChild(author)
    book.appendChild(pageNumber)
    
    math_book=rootNode.getElementsByTagName('book')[0]
    
    #insertBefore方法  父节点.insertBefore(新节点,父节点中的子节点)
    rootNode.insertBefore(book,math_book)
    #appendChild将新产生的子元素在最后插入
    # rootNode.appendChild(book)
    
    print(rootNode.toxml())
    
    with open(xml_file,'w',encoding='utf-8') as fh:
        domTree.writexml(fh,indent='',addindent='\t',newl='',encoding='utf-8')

     运行后显示效果:

    我上传的代码链接:

    Python解析创建xml文件的代码icon-default.png?t=LA92https://download.csdn.net/download/wjzholmes/71956966

    更多相关内容
  • XML文件解析编辑小工具 firstobject xml editor 2.4,绿色小巧方便实用
  • 主要介绍了java读取解析xml文件实例,本文创建了一个XML解析类同时讲解了循环节点输出方式,需要的朋友可以参考下
  • 与上一个版本一起使用可以可以起到提高效率的目的。本人解析xml的真实文档
  • NULL 博文链接:https://justsee.iteye.com/blog/930603
  • 资源名称:使用Javascript解析xml文件或xml格式字符串 中文WORD版   内容简介: 本文档主要讲述的是使用Javascript解析xml文件或xml格式字符串;javascript中,不论是解析xml文件,...
  • 1.内容中含有xml预定好的实体,如“<”和“&”,对xml来说是禁止使用的,针对这种字符,解决方式是使用CDATA部件以”<![CDATA[” 标记开始,以”]]>”标记结束,是CDATA内部内容被解析器忽略。具体说明参考...
  • 在网络存储过程中有很多时候会遇到XML文件解析和使用XML保存一些信息,解析XML文件用的比较多的方法是pull解析和SAX解析,但是我一般只用pull解析,下面就向cd卡写入一个XML文件,然后再使用pull解析的方法对文件...
  • C++解析xml文件

    2018-06-29 14:11:30
    C++实现对xml文件解析,C++实现对xml文件解析,C++实现对xml文件解析
  • 解析xml文件并将文件存入数据库一、使用dom4j对xml文件进行解析1、首先要有一个xml文件2、需求3、创建Books实例类4、开始解析xml文件5、测试代码:6、结果:二、进行数据库的数据交互1、在数据库中创建一个books表2...

    一、使用dom4j对xml文件进行解析

    首先dom4j是一个外包在使用之前需要导包

    链接:https://pan.baidu.com/s/1SNg292iRf_dtJeYdzcx2zw 
    提取码:w6gq
    

    导包的方法(如果你是用的是Maven,直接在pom文件里添加依赖就好了):
    在你的项目下创建一个lib文件夹把下载好的jar包复制进去,右击找到Build Path->Add to Build Path 就可以了。

    做好这些我们就开始解析XML文件了。

    1、首先要有一个xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
    	<book isbn="1">
    		<name>linux</name>
    		<author>王五</author>
    		<price>50</price>
    	</book>
    	<book isbn="2">
    		<name>xml</name>
    		<author>lili</author>
    		<price>20</price>
    	</book>
    	<book isbn="3">
    		<name>jvm</name>
    		<author>zs</author>
    		<price>100</price>
    	</book>
    </books>
    

    2、需求

    1、输出book信息
    2、book信息按照价格排序

    3、创建Books实例类

    通过xml文件分析,我们需要创建一个Books的实例类用来储存xml的数据

    public class Books {
    	private String name;
    	private long id;
    	private int price;
    	private String autherName;
    	public Books() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	public Books(String name, long id, int price, String autherName) {
    		super();
    		this.name = name;
    		this.id = id;
    		this.price = price;
    		this.autherName = autherName;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public long getId() {
    		return id;
    	}
    	public void setId(long id) {
    		this.id = id;
    	}
    	public int getPrice() {
    		return price;
    	}
    	public void setPrice(int price) {
    		this.price = price;
    	}
    	public String getAutherName() {
    		return autherName;
    	}
    	public void setAutherName(String autherName) {
    		this.autherName = autherName;
    	}
    	@Override
    	public String toString() {
    		return "Books [name=" + name + ", id=" + id + ", price=" + price + ", autherName=" + autherName + "]";
    	}
    	
    	
    }
    
    

    4、开始解析xml文件

    import java.util.Comparator;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeSet;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class Dom4jTest {
    	public Set<Books> analysisXML(){
    		try {
    			/*
    			 * 根据需求要求对价格进行排序
    			 * 
    			 */
    			Set<Books> list = new TreeSet<>(new Comparator<Books>() {
    
    				public int compare(Books o1, Books o2) {
    					if(o1.getPrice() > o2.getPrice()) {
    						return 1;
    					}else if(o1.getPrice() < o2.getPrice()) {
    						return -1;
    					}else {
    						
    						return 0;
    					}
    				}
    				
    			});
    			
    			
    			SAXReader reader = new SAXReader();
    			
    			Document document = reader.read("src/main/resources/cont.xml");
    			Element element = document.getRootElement();
    			
    			/*
    			 * 用一个集合接收Element中的数据
    			 * 方便后续操作
    			 */
    			List<Element> childElement = element.elements();
    			for(Element element2 : childElement) {
    				/*
    				 * 获取标签文本内容
    				 * getTestTrim()方法是返回一个String类型的数据
    				 * 并且去除多余的空格
    				 */
    				String name = element2.element("name").getTextTrim();
    				String price = element2.element("price").getTextTrim();
    				String author = element2.element("author").getTextTrim();
    				
    				/*
    				 * 获取属性
    				 * <book isbn="1"><book/>
    				 * 获取isbn
    				 */
    				String id = element2.attributeValue("isbn");
    				
    				/*
    				 * 创建book实例对象
    				 * 添加数据
    				 */
    				Books book = new Books();
    				book.setName(name);
    				book.setId(Long.parseLong(id));
    				book.setPrice(Integer.parseInt(price));
    				book.setAutherName(author);
    				
    				//将book对象添加到集合中
    				list.add(book);
    				
    			}
    			return list;
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    		
    	}
    }
    

    5、测试代码:

    public class ShowBook {
    	public static <T> void main(String[] args) {
    		Dom4jTest dom = new Dom4jTest();
    		
    		for (Books book : dom.analysisXML()) {
    			System.out.println(book);
    			
    		}
    		
    	}
    }
    

    6、结果:

    在这里插入图片描述

    二、进行数据库的数据交互

    数据库我用的是Oracle数据库

    如果你是用的不是Maven(如果你用的是maven那么你只需要在pom文件中添加依赖)就需要导包

    这是数据库连接池的jar包
    链接:https://pan.baidu.com/s/1DW0kM3PWq5ZzP--A4BipEQ 
    提取码:n68v 
    这是ojdbc8的jar包
    链接:https://pan.baidu.com/s/1IBSZ3DBdchVlfxg7UQJlaw 
    提取码:geqp
    

    1、在数据库中创建一个books表

    要向数据库中存入数据,就要在数据库中创建一books表

    --建表语句 大小不敏感
    create table Books(
    name varchar2(20) not null,
    id number primary key,
    price varchar2(11),
    authorname varchar2(200)
    );
    --删除表
    --drop table books
    --查询表中所有的消息
    select * from books
    

    建好表 查询一下里面没有内容
    在这里插入图片描述

    2、封装数据库连接

    现在我先封装一个数据库的连接

    
    import java.sql.Connection;
    
    import com.alibaba.druid.pool.DruidDataSource;
    
    /*
     *这个连接我用的是数据库连接池负责分配、管理和释放数据库连接,
     *它允许应用程序重复使用一个现有的数据库连接
     */
    public class OracleConnection {
    	private static DruidDataSource dataSource;
    	
    	static {
    		dataSource = new DruidDataSource();
    		
    		dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
    		dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
    		dataSource.setUsername("web");
    		dataSource.setPassword("web");
    		
    		//数据库连接的初始连接数为3
    		dataSource.setInitialSize(3);
    		
    		//数据库连接的最大上限为6
    		dataSource.setMaxActive(6);
    	}
    	
    	//是否需要手动提交事务
    	public static Connection getConnection(boolean autoCommit) {
    		Connection connection = null;
    		try {
    			connection = dataSource.getConnection();
    			connection.setAutoCommit(autoCommit);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    		return connection;
    		
    	}
    	//默认不自动提交事务
    	public static Connection getConnection() {
    		return getConnection(false);
    	}
    }	
    
    

    3、创建好连接后就开始编写插入数据和查询数据的代码

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    /*
     * 向数据库中添加数据的方法实现
     * 查询数据库中的数据方法的实现
     */
    public class BookDao {
    	public void insertDate(Books book) {
    		try {
    			//获取连接
    			Connection connection = OracleConnection.getConnection();
    			String sql = "insert into books values(?,?,?,?)";
    			
    			PreparedStatement pre = connection.prepareStatement(sql);
    			
    			//向insert语句中加入数据
    			pre.setString(1, book.getName());
    			pre.setLong(2, book.getId());
    			pre.setInt(3, book.getPrice());
    			pre.setString(4, book.getAutherName());
    			
    			pre.executeUpdate();
    			
    			//提交事务
    			connection.commit();
    			
    			pre.close();
    			connection.close();
    			
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    	
    	//从数据库中查询所有书籍
    	public List<Books> selectAllBooks(){
    		
    		try {
    			List<Books> list = new ArrayList<>();
    			
    			Connection connection = OracleConnection.getConnection();
    			
    			/*
    			 * 只是简单查询一下所有数据
    			 * 你可以根据你的需求修改sql语句
    			 * 如果你是像我这么分开写的那么在authorname后面一定要有一个空格
    			 * 否则会报没有关键字FROM的异常
    			 */
    			String sql = "select name,id,price,authorname "
    					+ "from books";
    			
    			PreparedStatement pre = connection.prepareStatement(sql);
    			
    			ResultSet result = pre.executeQuery();
    			
    			/*
    			 * 遍历数据
    			 * 将数据存入books实例类中
    			 * 再将对象添加到集合中
    			 */
    			while(result.next()) {
    				Books book = new Books();
    				book.setName(result.getString("name"));
    				book.setId(result.getLong("id"));
    				book.setPrice(result.getInt("price"));
    				book.setAutherName(result.getString("authorname"));
    				
    				list.add(book);
    				
    			}
    			return list;
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    	}
    }
    

    4、测试代码:

    
    public class ShowBook {
    	public static void main(String[] args) {
    		BookDao dao = new BookDao();
    		Dom4jTest dom = new Dom4jTest();
    		
    		//向数据库中存入数据
    		for (Books book : dom.analysisXML()) {
    			dao.insertDate(book);
    			
    		}
    		
    		//读取数据库中的数据
    		for (Books b : dao.selectAllBooks()) {
    			System.out.println(b);
    		}
    	}
    }
    

    5、结果

    数据库的将数据展示
    数据库中的数据
    控制台的数据输出
    控制台的数据输出

    展开全文
  • 问题 你想解析某个XML文档文档中使用了XML命名空间。 解决方案 考虑下面这使用了命名空间的文档: <?xml version="1.0" encoding="utf-8"?> <author>David Beazley <...</h1>
  • golang解析xml的方法

    2020-09-21 14:11:32
    主要介绍了golang解析xml的方法,结合实例形式分析了Go语言针对xml文件的读取与解析的相关技巧,需要的朋友可以参考下
  • 本篇文章主要介绍了java中利用Dom4j解析和生成XML文档,dom4j是一套非常优秀的Java开源api,主要用于读写xml文档,具有性能优异、功能强大、和非常方便使用的特点。有兴趣的可以了解一下。
  • XML解析工具

    2018-04-16 09:34:17
    读取和设置xml配置文件是最常用的操作,试用了几C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API...这解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
  • 支持SAX解析XML文件,DOM解析XML文件,Pull解析器解析XML文件,Pull生成XML文件,JAVA和Kotlin两种语言编写
  • 在线解析HTTP XML文件

    2016-10-17 16:50:57
    在线解析HTTP XML文件
  • JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML
  • NULL 博文链接:https://suky.iteye.com/blog/621169
  • 使用SAX DOM两种解析方式解析文件
  • 解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序...
  • domino通过lotusscript解析xml,支持xml文件、流及字符串,可以使用对象的方式访问创建xml,如:xmldocument.标签1.子标签3.getvalue
  • xml格式word文档解析

    2018-08-09 15:22:50
    自己编写的xml格式word文档分析器,完成了普通书签替换,表格书签替换,表格循环,嵌套循环数据生成表格等功能。请仔细阅读文件中“xml格式word解析器1 .md”
  • XML解析包xPath

    2018-04-19 20:25:07
    xPath.jar,XML解析包。XPath是获取xml中数据的种方式,其简单语法易用。
  • xml文件,可以下载,从一个网址上下载文件 ,按照格式解析
  • 文件解析要求,json解析和xml解析,前面文章说过Json转实体类,这里就说说解析XML 内容: Android Studio 解析XML常见的三种方式:DOM PULL SAX (实现XML转实体类并打印输出) 效果演示: 二丶正文 SAX(Simple ...
  • jsoup解析xml文件

    2014-12-04 22:21:37
    该资源包含了一个利用jsoup解析xml文件的简单demo,简单易懂。
  • c语言解析XML文件

    2015-09-22 23:23:20
    本指南中的例子代码示范主要做到: • 解析文档 • 取得指定元素的文本 • 添加一个元素及它的内容 • 添加一个属性 • 取得一个属性的值
  • shell 解析xml

    2019-03-26 01:02:32
    NULL 博文链接:https://jebai0521.iteye.com/blog/976949
  • 、python模块 xml.dom 解析XML的APIminidom.parse(filename)加载读取XML文件 doc.documentElement获取XML文档对象 node.getAttribute(AttributeName)获取XML节点属性值 node.getElementsByTagName(TagName)获取...
  • kettle 解析xml数据,xml多层分组嵌套,xml stax方法,完整解析案例使用(包含xml文件以及ktr文件)。ETL大数据迁移,数据清洗。XML Input Stream (StAX) 方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 621,165
精华内容 248,466
关键字:

如何解析一个xml文件