Ինչպե՞ս վերլուծել XML-ը և հաշվել Python-ում որոշակի հանգույցի հատկանիշի օրինակները:


XML-ի վերլուծությունը և Python-ում որոշակի հանգույցի հատկանիշի հաշվառումը կարելի է հասնել տարբեր մեթոդների միջոցով: XML-ը լայնորեն օգտագործվող ձևաչափ է՝ կառուցվածքային տվյալների պահպանման և փոխանակման համար: Python-ը տրամադրում է մի քանի գրադարաններ և մոտեցումներ XML-ի վերլուծության համար, ներառյալ ElementTree, lxml և xml.etree.ElementTree:

Այս հոդվածում մենք կսովորենք, թե ինչպես վերլուծել XML-ը և հաշվել Python-ում որոշակի հանգույցի հատկանիշի օրինակները: Մենք կանդրադառնանք տարբեր մոտեցումների՝ օգտագործելով հասանելի XML վերլուծական գրադարանները և ցույց կտանք գործնական օրինակներ: Այս հոդվածի վերջում դուք լավ կհասկանաք, թե ինչպես կարելի է վերլուծել XML-ը և հաշվել որոշակի հանգույցի հատկանիշի դեպքերը, ինչը ձեզ հնարավորություն կտա ավելի արդյունավետ կերպով կարգավորել XML տվյալները ձեր Python նախագծերում:

Մոտեցում է վերլուծելու XML-ը և հաշվում հանգույցի հատկանիշի դեպքերը

XML ֆայլերը վերլուծելու և կոնկրետ հանգույցի հատկանիշը հաշվելու համար կան տարբեր մեթոդներ, որոնք կարող են օգտագործվել: Եկեք ուսումնասիրենք այս առաջադրանքն իրականացնելու այդ մեթոդները.

Մոտեցում 1. ElementTree-ի օգտագործում

Այս մեթոդում մենք պատրաստվում ենք օգտագործել ElementTree գրադարանը՝ XML-ը վերլուծելու համար: ElementTree-ն Python ստանդարտ գրադարանի գրադարանային մաս է, որը տալիս է պարզ և հմուտ մեթոդ XML գրառումները վերլուծելու և կառավարելու համար: XML տվյալները ծառի կառուցվածքի մեջ վերլուծելու համար այն ապահովում է API, որը թեթև է և օգտագործման համար պարզ:

Այս մեթոդն օգտագործելու համար տրամադրեք XML ֆայլի ուղին, թիրախային հանգույցի անունը և հատկանիշի անունը, որը ցանկանում եք հաշվել: Ֆունկցիան կրկնվում է նշված հանգույցի բոլոր ատյաններում և ստուգում է արդյոք ցանկալի հատկանիշը գոյություն ունի:

Շարահյուսություն

Ստորև բերված շարահյուսությունը ցույց է տալիս XML-ի վերլուծությունը և դրա օրինակների հաշվումը ElementTree գրադարանի միջոցով.

import xml.etree.ElementTree as ET
def count_node_attribute(my_xml_file, my_node_name, my_attr_name):
    tree = ET.parse(my_xml_file)
    root = tree.getroot()
    count = 0
    for element in root.iter(my_node_name):
        if my_attr_name in element.attrib:
            count += 1
    return count

Օրինակ

Ստորև բերված օրինակում XML ֆայլը (myfile.xml) բեռնվում է ET.parse()-ի միջոցով և ստացվում է արմատային տարրը: Կրկնելով ցանկալի հանգույցի բոլոր օրինակների վրա՝ օգտագործելով root.iter(), ֆունկցիան ստուգում է, արդյոք նշված հատկանիշը գոյություն ունի յուրաքանչյուր տարրի ատրիբուտներում: Եթե գտնվի, ապա հաշվարկը ավելանում է: Վերջնական հաշվարկը վերադարձվում է:

XML (myfile.xml)

<root>
  <item name="List Item 1" />
  <item name="List Item 2" />
  <item name="List Item 3" />
  <item name="List Item 4" />
  <item name="List Item 5" />
</root>

Python

import xml.etree.ElementTree as ET
def count_node_attribute(my_xml_file, my_node_name, my_attr_name):
    tree = ET.parse(my_xml_file)
    root = tree.getroot()
    count = 0
    for element in root.iter(my_node_name):
        if my_attr_name in element.attrib:
            count += 1
    return count
# Example usage
my_xml_file = "myfile.xml"
my_node_name = "item"
my_attr_name = "name"
count = count_node_attribute(my_xml_file, my_node_name, my_attr_name)
print(count)

Արդյունք

5

Մոտեցում 2. Օգտագործելով lxml

Այս մեթոդում մենք պատրաստվում ենք օգտագործել lxml գրադարանը՝ XML-ը վերլուծելու համար: lxml-ը Python-ի երրորդ կողմի գրադարան է XML և HTML մշակման համար: Այն հիմնված է libxml2 և libxslt գրադարանների վերևի վրա՝ տալով ամուր և լավ կապի կետ XML-ի մշակման համար: Երբ համեմատվում է ElementTree-ի հետ, lxml-ն ապահովում է գործառույթների ավելի ընդարձակ շարք, ներառյալ աջակցություն XPath-ի, XSLT-ի և XML Schema-ի վավերացման համար:

Այս մեթոդն օգտագործելու համար այն նաև հետևում է ElementTree-ի նման օրինակին: Նախ, ներմուծեք etree մոդուլը, վերլուծեք XML ֆայլը և ստացեք արմատային տարրը: Այնուհետև կրկնեք ցանկալի հանգույցների վրա և հաշվեք նշված ատրիբուտով օրինակները:

Շարահյուսություն

Ստորև բերված շարահյուսությունը ցույց է տալիս XML-ի վերլուծությունը և դրա օրինակների հաշվումը lxml գրադարանի միջոցով.

from lxml import etree
def count_node_attribute(my_xml_file, my_node_name, my_attr_name):
    tree = etree.parse(my_xml_file)
    root = tree.getroot()
    count = 0
    for element in root.iter(my_node_name):
        if my_attr_name in element.attrib:
            count += 1
    return count

Օրինակ

Այս օրինակում XML ֆայլը (example.xml) վերլուծվում է etree.parse()-ի միջոցով, և արմատային տարրը հանվում է: Նախորդ մեթոդի նման, ֆունկցիան կրկնվում է նշված հանգույցների միջոցով՝ օգտագործելով root.iter() և ստուգում, թե արդյոք ցանկալի հատկանիշը գոյություն ունի յուրաքանչյուր տարրի ատրիբուտներում: Եթե այո, ապա հաշվարկը ավելանում է, և վերջնական հաշվարկը վերադարձվում է:

XML (example.xml)

<root>
  <item name="List Item 1" />
  <item name="List Item 2" />
  <item name="List Item 3" />
  <item name="List Item 4" />
  <item name="List Item 5" />
</root>

Պիթոն

from lxml import etree
def count_node_attribute(my_xml_file, my_node_name, my_attr_name):
    tree = etree.parse(my_xml_file)
    root = tree.getroot()
    count = 0
    for element in root.iter(my_node_name):
        if my_attr_name in element.attrib:
            count += 1
    return count
# Example usage
my_xml_file = "example.xml"
my_node_name = "item"
my_attr_name = "name"
count = count_node_attribute(my_xml_file, my_node_name, my_attr_name)
print(count)

Արդյունք

5

Մեթոդ 3. XPath-ի օգտագործում lxml-ով

Այս մեթոդով մենք պատրաստվում ենք օգտագործել XPath-ը lxml գրադարանի հետ՝ XML-ը վերլուծելու համար: XPath-ն օգտագործվում է XML փաստաթղթից հանգույցներ ընտրելու համար: XML կառուցվածքի կոնկրետ տարրերին անդրադառնալու համար այն ապահովում է հզոր, բայց հակիրճ շարահյուսություն: Բարդ օրինաչափություններ, որոնք համընկնում են հանգույցների վրա՝ հիմնվելով դրանց տարրերի անունների, հատկանիշների և այլ հանգույցների հետ հարաբերությունների վրա, կարող են սահմանվել XPath-ով:

Այս մեթոդն օգտագործելու համար պարզապես տրամադրեք XML ֆայլի ուղին և XPath արտահայտությունը որպես ֆունկցիայի պարամետրեր:

Շարահյուսություն

Ստորև բերված շարահյուսությունը ցույց է տալիս XML-ի վերլուծությունը և հաշվում դրա օրինակները՝ օգտագործելով XPath-ը lxml գրադարանով.

from lxml import etree
def count_node_attribute(my_xml_file, xpath_exp):
    tree = etree.parse(my_xml_file)
    count = len(tree.xpath(xpath_exp))
    return count

Օրինակ

Այս օրինակում XML ֆայլը վերլուծվում է՝ օգտագործելով etree.parse(): Հանգույցների վրա կրկնելու փոխարեն այս մեթոդը ուղղակիորեն կիրառում է XPath արտահայտությունը՝ օգտագործելով tree.xpath(): XPath արտահայտությունը ընտրում է ցանկալի հանգույցի բոլոր օրինակները նշված հատկանիշով: Այնուհետև ֆունկցիան վերականգնում է ստացված հանգույցների ցանկի երկարությունը և այն վերադարձնում որպես հաշվարկ:

XML (myfile.xml)

<root>
  <item name="List Item 1" />
  <item name="List Item 2" />
  <item name="List Item 3" />
  <item name="List Item 4" />
  <item name="List Item 5" />
</root>

Պիթոն

from lxml import etree
def count_node_attribute(my_xml_file, xpath_exp):
    tree = etree.parse(my_xml_file)
    count = len(tree.xpath(xpath_exp))
    return count
# Example usage
my_xml_file = "myfile.xml"
xpath_exp = "//item[@name]"
count = count_node_attribute(my_xml_file, xpath_exp)
print(count)

Արդյունք

5

Եզրակացություն

XML-ի վերլուծությունը և Python-ում կոնկրետ հանգույցի հատկանիշի հաշվառումը կարելի է հասնել տարբեր մեթոդների միջոցով: ET.parse() մեթոդը ElementTree գրադարանում հեշտացնում է XML-ի վերլուծությունը և դեպքերի հաշվումը` կրկնելով հանգույցների վրա: lxml գրադարանը, որը հիմնված է libxml2-ի և libxslt-ի վրա, առաջարկում է հետագա զարգացած տարրեր և աջակցում է XPath-ին XML-ի հարցաքննության համար: Օգտագործելով etree.parse(), դուք կարող եք վերլուծել XML-ը lxml-ով և կրկնել ElementTree-ի նման հանգույցների վրա: Բացի այդ, tree.xpath()-ը և lxml-ը թույլ են տալիս ուղղակիորեն օգտագործել XPath արտահայտությունները՝ հանգույցներ ընտրելու և օրինակները հաշվելու համար: Python-ի հաշվարկների համար, որոնք հիմնված են կոնկրետ հանգույցների ատրիբուտների և XML վերլուծության վրա, այս մեթոդներն առաջարկում են ճկունություն և options.options XML-ի վերլուծության և հանգույցների հատուկ ատրիբուտների հիման վրա հաշվարկներ կատարելու համար: