ホームページ > バックエンド開発 > Python チュートリアル > Python が XML ファイルをどのように操作するかを分析してみましょう

Python が XML ファイルをどのように操作するかを分析してみましょう

WBOY
リリース: 2022-05-05 21:13:52
転載
3295 人が閲覧しました

この記事では、python に関する関連知識を提供します。主に、XML の基本の概要、Python による XML ファイルの解析、XML ファイルの作成、XML ファイルの更新など、Python による XML ファイルの操作方法に関する関連問題を紹介します。 , など、以下で見ていきましょうので、皆さんの参考になれば幸いです。

Python が XML ファイルをどのように操作するかを分析してみましょう

#推奨学習:

Python ビデオ チュートリアル

#1. XML の基礎の概要

1. XML とは何ですか?

XML (Extensible Markup Language): Extensible Markup Language. XML は、インターネット データ送信のための重要なツールです。インターネット上のあらゆるプラットフォームにまたがることができ、プログラミング言語や言語によって制限されません。インターネットへのアクセスレベルが最も高いデータキャリアと言えます。 XML は、現在構造化文書情報を処理する上で非常に強力なテクノロジであり、サーバー間で構造化データをやり取りするのに役立ち、開発者はデータの保存と送信をより簡単に制御できます。

Xml は、電子ファイルをマークして構造化するために使用されるマークアップ言語です。データをマークし、データ型を定義するために使用できます。ユーザーが独自のマークアップ言語を定義できるソース言語です。 XML は Standard Generalized Markup Language (SGML) のサブセットであり、Web 送信に非常に適しています。 XML は、アプリケーションやベンダーに依存せずに構造化データを記述および交換するための統一された方法を提供します。

2. XML の特徴と機能

特徴:

    xm|プログラミングの開発プラットフォームとは関係ありませんlanguage
  • 異なるシステム間のデータ対話を実現します。

機能:

  • アプリケーションとWebサイトの構成;

  • データ対話;

  • Ajax の基礎。

3. XML ファイル形式

    宣言
  • ルート要素
  • 子要素
  • 属性
  • 名前空間
  • 修飾名
HTML と同様、XML もタグ間にデータを格納するマークアップ言語です。これは人間が判読可能で拡張可能であるため、独自のマークアップを自由に定義できます。 XML の属性、要素、タグは HTML のものと似ています。 XML ファイルには宣言を含めることも、宣言を含めないこともできます。ただし、宣言がある場合は、それが XML ファイルの最初の行である必要があります。例:

<?xml  version="1.0” encoding=&#39; "UTF-8" standalone=" no”?>
ログイン後にコピー
この宣言ステートメントには、バージョン、エンコーディング、独立性の 3 つの部分があります。バージョンは、使用されている XML 標準のバージョンを指定します。エンコーディングは、このファイルで使用される文字エンコーディングのタイプを示します。スタンドアロンは、XML ファイルの内容を解釈するために外部情報が必要かどうかをパーサーに指示します。

XML ファイルは、XML ツリーとして表すことができます。この XML ツリーはルート要素 (親要素) から始まります。このルート要素はさらに子要素に分岐します。 XML ファイルの各要素は、XML ツリー内のノードです。子ノードを持たない要素はリーフ ノードです。次の図は、元の XML ファイルと XML ファイルのツリー表現を明確に区別しています。


Python が XML ファイルをどのように操作するかを分析してみましょう
Python が XML ファイルをどのように操作するかを分析してみましょう
Python が XML ファイルをどのように操作するかを分析してみましょう## 2. Python は XML ファイルを解析します

新しい

1.xml

ファイルを作成します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;collection&gt; &lt;class&gt;    &lt;code&gt;2022001&lt;/code&gt;    &lt;number&gt;10&lt;/number&gt;    &lt;teacher&gt;小白&lt;/teacher&gt; &lt;/class&gt; &lt;class&gt;    &lt;code&gt;2022002&lt;/code&gt;    &lt;number&gt;20&lt;/number&gt;    &lt;teacher&gt;小红&lt;/teacher&gt; &lt;/class&gt; &lt;class&gt;    &lt;code&gt;2022003&lt;/code&gt;    &lt;number&gt;30&lt;/number&gt;    &lt;teacher&gt;小黑&lt;/teacher&gt; &lt;/class&gt;&lt;/collection&gt;</pre><div class="contentsignin">ログイン後にコピー</div></div>1.ElementTree メソッド

ElementTree モジュールは、軽量の Python API を提供します。効率的な C 言語実装である xml.etree.cElementTree です。 DOM と比較すると、ET は高速で、API はより直接的で使いやすいです。 SAX と比較すると、ET.iterparse 関数はオンデマンド解析機能も提供しており、ドキュメント全体を一度にメモリに読み込むことはありません。 ET のパフォーマンスは SAX モジュールのパフォーマンスとほぼ同じですが、その API はより高レベルであり、ユーザーにとってより使いやすいものです。

要素オブジェクト メソッド:

#クラスメソッド説明##Element.iter(tag=None) Element.iterfind(path, namespaces=None)Element.itertext()#Element.findall(path)Element.findtext(path,default=None, namespaces=None)Element.find(path)Element.textElement.get(key,default=None)Element.keys()##要素 .items() #Element.getiterator(self, tag=None)属性メソッド
要素のすべての子孫を走査するか、走査して検索するタグを指定できます。
タグまたはパスに基づいてすべての子孫を検索します。
すべての子孫を走査し、テキスト値を返します。
タグまたはパスが一致する現在の要素の下の直接ノードを検索します
最初に一致した子要素を検索し、そのテキスト値を返します。一致するオブジェクトはタグまたはパスです。
現在の要素の下で、タグまたはパスが一致する最初の直接ノードを検索します。
現在の要素のテキスト値を取得します。
要素の指定されたキーに対応する属性値を取得します。そのような属性がない場合は、デフォルト値を返します。
要素の属性名のリストを返します
Return (name, value) list ##Element.getchildren()
#Element.getiterator(tag=None)

:
メソッド名

#説明

ノード名 (タグ) (文字列)属性 (dict)Text(text)(str)追加テキスト (末尾) (str)子ノード リスト (リスト)

1)接下来,我们加载这个文档,并进行解析:

>>> import xml.etree.ElementTree as ET>>> tree = ET.ElementTree(file='1.xml')
ログイン後にコピー

2) 然后,我们获取根元素(root element):

>>> tree.getroot()<element></element>
ログイン後にコピー

3)根元素(root)是一个Element对象。我们看看根元素都有哪些属性:

>>> root = tree.getroot()>>> root.tag, root.attrib('collection', {'shelf': 'New Arrivals'})
ログイン後にコピー

4)根元素也具备遍历其直接子元素的接口:

>>> for child_of_root in root:...     print(child_of_root.tag, child_of_root.attrib)...class {'className': '1班'}class {'className': '2班'}class {'className': '3班'}
ログイン後にコピー

5)通过索引值来访问特定的子元素:

>>> root[0].tag, root[0].text('class', '\n\t   ')
ログイン後にコピー

6) 查找需要的元素

从上面的示例中,可以明显发现我们能够通过简单的递归方法(对每一个元素,递归式访问其所有子元素)获取树中的所有元素。但是,由于这是十分常见的工作,ET提供了一些简便的实现方法。

Element对象有一个iter方法,可以对某个元素对象之下所有的子元素进行深度优先遍历(DFS)。ElementTree对象同样也有这个方法。下面是查找XML文档中所有元素的最简单方法:

>>> for elem in tree.iter():...     print(elem.tag, elem.attrib)...collection {'shelf': 'New Arrivals'}class {'className': '1班'}code {}number {}teacher {}class {'className': '2班'}code {}number {}teacher {}class {'className': '3班'}code {}number {}teacher {}
ログイン後にコピー

7)对树进行任意遍历——遍历所有元素,iter方法可以接受tag名称,然后遍历所有具备所提供tag的元素:

>>> for elem in tree.iter(tag='teacher'):...     print(elem.tag, elem.text)...teacher 小白
teacher 小红
teacher 小黑
ログイン後にコピー

8)支持通过XPath查找元素

>>> for elem in tree.iterfind('class/teacher'):...     print(elem.tag, elem.text)...teacher 小白
teacher 小红
teacher 小黑
ログイン後にコピー

9)查找所有具备某个name属性的className元素:

>>> for elem in tree.iterfind('class[@className="1班"]'):...     print(elem.tag, elem.attrib)...class {'className': '1班'}
ログイン後にコピー

10)完整解析代码

import xml.etree.ElementTree as ET

tree = ET.ElementTree(file='1.xml')print(type(tree))root = tree.getroot()  # root是根元素print(type(root))print(root.tag)for index, child in enumerate(root):
    print("第%s个%s元素,属性:%s" % (index, child.tag, child.attrib))
    for i, child_child in enumerate(child):
        print("标签:%s,内容:%s" % (child_child.tag, child_child.text))
ログイン後にコピー

输出结果:

<class><class>collection
第0个class元素,属性:{'className': '1班'}标签:code,内容:2022001标签:number,内容:10标签:teacher,内容:小白
第1个class元素,属性:{'className': '2班'}标签:code,内容:2022002标签:number,内容:20标签:teacher,内容:小红
第2个class元素,属性:{'className': '3班'}标签:code,内容:2022003标签:number,内容:30标签:teacher,内容:小黑</class></class>
ログイン後にコピー

2、DOM 方式

DOM (Document Object Model)将XML文档作为一棵树状结构进行分析,获取节点的内容以及相关属性,或是新增、删除和修改节点的内容。XML解析器在加载XML文件以后,DQM模式将XML文件的元素视为一个树状结构的节点,一次性读入内存。

解析代码:

from xml.dom.minidom import parse# 读取文件dom = parse('1.xml')# 获取文档元素对象elem = dom.documentElement# 获取 classclass_list_obj = elem.getElementsByTagName('class')print(class_list_obj)print(type(class_list_obj))for class_element in class_list_obj:
    # 获取标签中内容
    code = class_element.getElementsByTagName('code')[0].childNodes[0].nodeValue
    number = class_element.getElementsByTagName('number')[0].childNodes[0].nodeValue
    teacher = class_element.getElementsByTagName('teacher')[0].childNodes[0].nodeValue    print('code:', code, ', number:', number, ', teacher:', teacher)
ログイン後にコピー

输出结果:

[<dom>, <dom>, <dom>]<class>code: 2022001 , number: 10 , teacher: 小白
code: 2022002 , number: 20 , teacher: 小红
code: 2022003 , number: 30 , teacher: 小黑</class></dom></dom></dom>
ログイン後にコピー

三、Python写入XML文件

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

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

参数说明

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

案例代码:

import xml.dom.minidom
# 1、在内存中创建一个空的文档doc = xml.dom.minidom.Document()
# 2、创建根元素root = doc.createElement('collection ')# print('添加的xml标签为:',root.tagName)
# 3、设置根元素的属性root.setAttribute('type', 'New Arrivals')
# 4、将根节点添加到文档对象中doc.appendChild(root)
# 5、创建子元素book = doc.createElement('book')
# 6、添加注释book.appendChild(doc.createComment('这是一条注释'))
# 7、设置子元素的属性book.setAttribute('语言', 'java')
# 8、子元素中嵌套子元素,并添加文本节点name = doc.createElement('name')name.appendChild(doc.createTextNode('java基础'))price = doc.createElement('价格')price.appendChild(doc.createTextNode('99元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余100本'))# 9、将子元素添加到boot节点中book.appendChild(name)book.appendChild(price)book.appendChild(number)# 10、将book节点添加到root根元素中root.appendChild(book)# 创建子元素book = doc.createElement('book')# 设置子元素的属性book.setAttribute('语言', 'python')# 子元素中嵌套子元素,并添加文本节点name = doc.createElement('name')name.appendChild(doc.createTextNode('python基础'))price = doc.createElement('价格')price.appendChild(doc.createTextNode('50元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余20本'))#  将子元素添加到boot节点中book.appendChild(name)book.appendChild(price)book.appendChild(number)# 将book节点添加到root根元素中root.appendChild(book)print(root.toxml())fp = open('./书籍.xml', 'w', encoding='utf-8')  # 需要指定utf-8的文件编码格式,不然notepad中显示十六进制doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding='utf-8')fp.close()
ログイン後にコピー

生成书籍.xml文件:

Python が XML ファイルをどのように操作するかを分析してみましょう

四、Python更新XML文件

向xml中插入新的子元素

案例代码:

import xml.dom.minidomfrom xml.dom.minidom import parse# 对book.xml新增一个子元素english,并删除math元素xml_file = './书籍.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('语言', 'c++')# 子元素中嵌套子元素,并添加文本节点name = doc.createElement('name')name.appendChild(doc.createTextNode('c++基础'))price = doc.createElement('价格')price.appendChild(doc.createTextNode('200元'))number = doc.createElement('number')number.appendChild(doc.createTextNode('剩余300本'))#  将子元素添加到boot节点中book.appendChild(name)book.appendChild(price)book.appendChild(number)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 ファイルをどのように操作するかを分析してみましょう

五、XML文件和JSON文件互转

记录工作中常用的一个小技巧

cmd控制台安装第三方模块

pip install xmltodict
ログイン後にコピー

1、XML文件转为JSON文件

新建一个1.xml文件:

<note>
	<to>tom</to>
	<from>mary</from>
	<msg>love</msg></note>
ログイン後にコピー

Python が XML ファイルをどのように操作するかを分析してみましょう

转换代码实现

import jsonimport xmltodictdef xml_to_json(xml_str):
    """parse是的xml解析器,参数需要

    :param xml_str: xml字符串
    :return: json字符串
    """
    xml_parse = xmltodict.parse(xml_str)
    # json库dumps()是将dict转化成json格式,loads()是将json转化成dict格式。
    # dumps()方法的ident=1,格式化json
    json_str = json.dumps(xml_parse, indent=1)
    return json_str


XML_PATH = './1.xml'  # xml文件的路径with open(XML_PATH, 'r') as f:
    xmlfile = f.read()
    with open(XML_PATH[:-3] + 'json', 'w') as newfile:
        newfile.write(xml_to_json(xmlfile))
ログイン後にコピー

输出结果(生成json文件):
Python が XML ファイルをどのように操作するかを分析してみましょう

2、JSON文件转换为XML文件

新建test.json文件:

{
  "student": {
    "course": {
      "name": "math",
      "score": "90"
    },
    "info": {
      "sex": "male",
      "name": "name"
    },
    "stid": "10213"
  }}
ログイン後にコピー

Python が XML ファイルをどのように操作するかを分析してみましょう

转换代码实现:

import xmltodictimport jsondef json_to_xml(python_dict):
    """xmltodict库的unparse()json转xml

    :param python_dict: python的字典对象
    :return: xml字符串
    """
    xml_str = xmltodict.unparse(python_dict)
    return xml_str


JSON_PATH = './test.json'  # json文件的路径with open(JSON_PATH, 'r') as f:
    jsonfile = f.read()
    python_dict = json.loads(jsonfile)  # 将json字符串转换为python字典对象
    with open(JSON_PATH[:-4] + 'xml', 'w') as newfile:
        newfile.write(json_to_xml(python_dict))
ログイン後にコピー

输出结果(生成xml文件):
Python が XML ファイルをどのように操作するかを分析してみましょう

推荐学习:python视频教程

##Element.tag
Element.attrib
Element.text
Element.tail
Element[:]

以上がPython が XML ファイルをどのように操作するかを分析してみましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート