elementtree 相关问题

ElementTree是一个用于创建和解析XML的Python库。

Python 写入 XML 而不是重写输入

我正在尝试创建一个程序,该程序允许我接收人员信息,然后将其写入 xml 文档,保存它,然后一旦程序再次运行,它将从我离开的位置开始。 ..

回答 3 投票 0

xml.etree.ElementTree 将 xml 文件中的双标签转换为单标签

我的意思是如何使用 ElementTree 将 MyBro 标签从双标签转换为单标签? 来自:史蒂夫 至: 附:问我做了什么?搜索了文档和整个

回答 1 投票 0

Python ETree.find 未找到复杂路径

我有一个如下所示的 xml 元素 我有一个如下所示的 xml 元素 <PI Name="MonitoredVariable"> <Reference Object="SomeName" /> </PI> <PI Name = "Other Properties" /> <PI Name = "Other Properties" /> <PI Name = "Other Properties" /> 我想抓取参考元素 当我尝试使用抓取参考元素时 ref = elem.find("./PI[@Name='MonitoredVariable']/Reference") ref 最终为 None。 当我尝试使用抓取参考元素时 if superref := elem.find("./PI[@Name='MonitoredVariable']"): ref = superref.find('Reference') ref 最终成为正确的值。第二组代码更难理解,而且可能更慢,所以我更愿意找出为什么第一组代码不起作用。 您的问题不清楚,请编辑,您喜欢捕捉什么以及您的根标签看起来如何? import xml.etree.ElementTree as ET xml_s = """<root><PI Name="MonitoredVariable"> <Reference Object="SomeName" /> </PI> <PI Name = "Other Properties" /> <PI Name = "Other Properties" /> <PI Name = "Other Properties" /></root>""" tree = ET.fromstring(xml_s) ref = tree.find(".//PI/Reference[@Object]") print(ref.attrib['Object']) 输出: SomeName

回答 1 投票 0

无法在 python xml.etree.ElementTree 中找到访问 XPath 中的元素

我一直在兜圈子。我的任务是读取 xml 文档。解析记录以查找 ID。使用该 ID 执行一些 SQL。然后将 xml 的值与 SQL 的值进行比较。如果...

回答 1 投票 0

修改xml文件python

我有一个如下所示的 xml 文件 文件名:abc.nuspec 我有一个如下所示的 xml 文件 文件名:abc.nuspec <?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> <metadata> <id>aa-bb-cc</id> <version>1.0.0</version> <authors>first last</authors> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Google DialogFlow proto classes library</description> <dependencies> <group targetFramework=".NETStandard2.0"> <dependency id="Google.Cloud.Dialogflow.V2" version="3.1.0" exclude="Build,Analyzers" /> <dependency id="Google.Protobuf" version="3.15.6" exclude="Build,Analyzers" /> <dependency id="Grpc.Core" version="2.36.1" exclude="Build,Analyzers" /> <dependency id="Grpc.Core.Api" version="2.36.1" exclude="Build,Analyzers" /> <dependency id="Grpc.Net.Client" version="2.36.0" exclude="Build,Analyzers" /> </group> </dependencies> </metadata> </package> 如果元数据字段中尚未存在,我想添加以下行, “< repository url="https://github.com/test/test-repo" type="get" />” 这是我找到的代码 import xml.etree.ElementTree as ET root = ET.parse(f'abc.nuspec').getroot() path = root.find("metadata") myattributes = {"url": "https://github.com/test/test-repo", "type": "get"} new = ET.SubElement(path, 'repository', attrib=myattributes) print(ET.tostring(root, short_empty_elements=False).decode()) 但是上面的代码不起作用。我在这里做错了什么吗? 您可以检查存储库标签是否在元数据标签列表内,如果没有则创建 SubElement()。并且不要忘记注册您的名称空间: import xml.etree.ElementTree as ET tree = ET.parse("abc.nuspec") root = tree.getroot() namespaces = {node[0]: node[1] for event, node in ET.iterparse("abc.nuspec", events=['start-ns'])} print("My Namespaces:", namespaces,'\n') for ns in namespaces: ET.register_namespace(ns, namespaces[ns]) for meta in root.findall("metadata", namespaces): if meta.findall("repository", namespaces): pass else: rep = ET.SubElement(meta, "repository") rep.set("url", "https://github.com/test/test-repo") rep.set("type", "get" ) ET.dump(root) tree1 = ET.ElementTree(root) ET.indent(tree1, space= ' ') tree1.write('abc_new.nuspec', encoding="utf-8", xml_declaration=True) 谢谢,这对我有用,这里,如果meta.findall("repository", namespaces)返回true,并且如果已经有任何值,如何修改url的值?说测试-repo-1? . 一种有效的方法是删除存储库元素并创建新元素。 if meta.findall("repository", namespaces): for ele in meta.iter(): if ele.tag.endswith("repository"): meta.remove(ele) rep = ET.SubElement(meta, "repository") rep.set("url", "https://github.com/incontact/test-repo-1") rep.set("type", "nuget") else: rep = ET.SubElement(meta, "repository") rep.set("url", "https://github.com/incontact/test-repo-1") rep.set("type", "nuget") 还有更好的方法吗?

回答 2 投票 0

xml文件和python中的逻辑门(故障树分析)

我想使用python和xml文件对系统进行故障树分析,但我找不到足够的材料来帮助我。 假设我有一个简单的 xml 文件,其中包含 Top 事件和 OR 逻辑门

回答 1 投票 0

未创建 xml 文件的问题

在此代码中,打印(计数)语句也未显示,也没有创建 xml 文件。为什么未创建 xml 文件是 raise 语句的问题。 代码 - - - 导入操作系统 导入 xml.etree.ElementTree 作为 ET

回答 1 投票 0

在 python 中解析 xml 并更改名称空间属性

我正在向 URL 发出请求,在我收到的 xml 响应中,xmlns 属性命名空间会不时发生变化。因此,当我对命名空间进行硬编码时,找到一个元素将返回 None 。请他...

回答 1 投票 0

ET.fromstring 给出 ParseError

我正在尝试解析 xml 字符串,我只想要 PackageReference Include 属性详细信息及其版本。当我说 ET.fromstring(xml) 时,它会给出类似 xml.etree.ElementTree.Pars 的错误...

回答 1 投票 0

尝试解析 xml 会抛出 FileNotFoundError

Python 新手,我所做的就是解析一个简单的 xml 字符串。但是当我这样做时,Et.parse 上显示“没有这样的文件或目录”。我也尝试说 Et.parse(Et.fromstring(xmlfile)) 但仍然......

回答 1 投票 0

调用 ElementTree.parse 时出现“XML 或文本声明不在实体开头:第 2 行,第 0 列”

ElementTree.parse() 在下面的简单示例中失败并出现错误 xml.etree.ElementTree.ParseError:XML 或文本声明不在实体开头:第 2 行,第 0 列 XML 看起来有效并且

回答 3 投票 0

如何使用 xml.etree.ElementTree 保存读取文件中的 XML 声明

我正在读取一个xml文件,添加一些标签并写入它。 我读到的文件有 我的输出只有 我正在读取一个 xml 文件,添加一些标签并写入它。 我读到的文件有 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 我的输出只有 <?xml version="1.0" ?> 我使用以下代码 import os from xml.dom import minidom import xml.etree.ElementTree as ET tree = ET.parse(xml_file) root = tree.getroot() access = "" # ... (rest of the processing logic) # Write to a temporary string to control indentation rough_string = ET.tostring(root, 'utf-8') reparsed = minidom.parseString(rough_string) # Write the formatted XML to the original file without empty lines and version information with open(xml_file, 'w', encoding='utf-8') as f: for line in reparsed.toprettyxml(indent=" ").splitlines(): if line.strip(): f.write(line + '\n') 如何保留原始文档中的 XML 声明? 编辑: 我通过手动添加行解决了这个问题 with open(xml_file, 'w', encoding='utf-8') as f: custom_line = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' f.write(custom_line + '\n') for line in reparsed.toprettyxml(indent=" ").splitlines(): if line.strip() and not line.startswith('<?xml'): f.write(line + '\n') 我认为 xml.etree.ElementTree 不支持 xml_declaration 中的独立。 使用 minidom 你可以做到这一点,例如: from xml.dom.minidom import parseString dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>') # write declaration with standalone with open("myfile.xml", "w") as xml_file: dom3.writexml(xml_file, indent=' ', newl='\n', encoding='utf-8', standalone=True) 给出xml声明: <?xml version="1.0" encoding="utf-8" standalone="yes"?> . . . 查找文档。 或者作为 xml.etree.ElementTree 的替代解决方案,您可以找到 here 我通过添加这行解决了这个问题 with open(xml_file, 'w', encoding='utf-8') as f: custom_line = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' f.write(custom_line + '\n') for line in reparsed.toprettyxml(indent=" ").splitlines(): if line.strip() and not line.startswith('<?xml'): f.write(line + '\n')

回答 2 投票 0

使用 ElemTree Python 从 xml 标签和标签的可选子元素中获取文本元素

我有一个 xml 文档(保存在我的驱动器上): xml=""" 这里有一些文字 &#2...

回答 2 投票 0

如何以相同的日期格式更新属性值

我想更改 PublicationDateTime="2023-07-31T07:02:59+00:00" 属性。 我的 XML 是 我想更改 publicationDateTime="2023-07-31T07:02:59+00:00" 属性。 我的xml是 <?xml version="1.0" encoding="UTF-8" standalone="no"?><Research xmlns="http://www.rixml.org/2005/3/RIXML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" createDateTime="2023-07-31T07:02:16+00:00" language="eng" researchID="GPS-4409687-0" xsi:schemaLocation="http://www.rixml.org/2005/3/RIXML http://www.rixml.org/assets/documents/schemas/RIXML-2_4.xsd"> <Product productID="12345-0"> <Source> <Organization primaryIndicator="Yes" type="SellSideFirm"> <OrganizationID idType="VendorCode">ABP</OrganizationID> <OrganizationName nameType="Display">ABCDF</OrganizationName> </Organization> </Source> <Content> <Title>Novice</Title> </Content> <Context external="Yes"> <ProductDetails periodicalIndicator="No" publicationDateTime="2023-07-31T07:02:59+00:00"> <ProductCategory productCategory="Support"/> </ProductDetails> </Context> </Product> </Research> 这是我的代码 import os import xml.etree.ElementTree as ET import uuid import time ET.register_namespace('', "http://www.rixml.org/2005/3/RIXML") ET.register_namespace('', "http://www.rixml.org/2005/3/RIXML") OUTPUT_FOLDER = "OUTPUT/" input_folder = "INPPUT/" all_files = os.listdir(input_folder) json_files = {f: f for f in all_files if f.endswith(".xml")} json_files_keys = list(json_files.keys()) json_files_keys.sort() for file_name in json_files_keys: print(file_name) xmlTree = ET.parse(input_folder+file_name) root = xmlTree.getroot() print(root) print(root.attrib) for child in root: print(child.attrib) pid = '2023-08-04T08:02:59+00:00' print(pid) child.set('publicationDateTime', pid) xmlTree.write(OUTPUT_FOLDER+file_name) print("written") 我无法更新属性。它被添加到根级别。 请建议如何在同一位置添加。 我是Python新手,如果这是一个非常明显的问题,我深表歉意。

回答 0 投票 0

使用 root.iter 使用 Python 解析 xml 文件不会列出文本

我正在尝试使用Python来解析xml文件。我想识别指定 xml 标签之间出现的文本。 我正在运行的代码是 导入 xml.etree.ElementTree 作为 ET 树 = ET.parse('

回答 2 投票 0

如何复制xml.etree中的节点?

我正在使用 xml.etree 模块来解析 xml 文件。 在处理元素树时,我需要对其中的节点进行操作,而不更改树中存储的数据。因此我想复制节点...

回答 0 投票 0

如何使用 Python 将标记添加到 XML 文本

我有一个 XML 格式的标记文本。我需要添加标记,即为文本中出现的某些词添加标签。 这就是我正在尝试的方式: 将 xml.etree.ElementTree 导入为 ET 文件 = ...

回答 3 投票 0

使用 import lxml.etree as ElementTree 抓取 xml 数据的最有效方法是什么

我正在尝试学习如何使用 XML 抓取网站。我对 html 非常熟悉,但我注意到我尝试抓取的一些网站具有 XML API。如果我没记错的话,它会更快、更快……

回答 0 投票 0

如何使用 python 更改 xml 中属性的命名空间?

就我而言,我有以下代码: 从 lxml 导入 etree as et 从 lxml.builder 导入 ElementMaker WSS_SCHEMA = "http://schemas.xmlsoap.org/ws/2002/12/secext" ACTOR_SCHEMA = "...

回答 0 投票 0

使用 python 在 HTML 中解析 XML

我有一个 HTML 文件,它的底部包含 XML 并附有注释,它看起来像这样: *** 我有一个 HTML 文件,它的底部包含 XML 并附有注释,它看起来像这样: <!DOCTYPE html> <html> <head> *** </head> <body> <div class="panel panel-primary call__report-modal-panel"> <div class="panel-heading text-center custom-panel-heading"> <h2>Report</h2> </div> <div class="panel-body"> <div class="panel panel-default"> <div class="panel-heading"> <div class="panel-title">Info</div> </div> <div class="panel-body"> <table class="table table-bordered table-page-break-auto table-layout-fixed"> <tr> <td class="col-sm-4">ID</td> <td class="col-sm-8">1</td> </tr> </table> </div> </div> </body> </html> <!--<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?> <ROOTTAG> <mytag> <headername>BASE</headername> <fieldname>NAME</fieldname> <val><![CDATA[Testcase]]></val> </mytag> <mytag> <headername>BASE</headername> <fieldname>AGE</fieldname> <val><![CDATA[5]]></val> </mytag> </ROOTTAG> --> 需求是解析上面HTML中注释中的XML。 到目前为止,我已经尝试读取 HTML 文件并将其传递给字符串并执行以下操作: with open('my_html.html', 'rb') as file: d = str(file.read()) d2 = d[d.index('<!--') + 4:d.index('-->')] d3 = "'''"+d2+"'''" 这是用 3 个单引号返回字符串 d3 中的 XML 数据片段。 然后尝试通过 Etree 阅读它: ET.fromstring(d3) 但失败并出现以下错误: xml.etree.ElementTree.ParseError:格式不正确(无效标记):第 1 行,第 2 列 基本上需要一些帮助: 阅读 HTML 取出 HTML 底部注释的 XML 片段 获取该字符串并传递给 ET.fromString() 函数,但由于该函数接受带有三重引号的字符串,因此它没有正确格式化并因此抛出错误 首先,通过逐行阅读并使用 if string.startswith 过滤掉评论块来拆分您的 html 和 xml: with open('xmlfile.xml') as fh: html, xml = [], [] for line in fh: # check for that comment line if line.startswith('<!--'): break html.append(line) # append current line xml.append(line) # keep iterating for line in fh: # check for ending block comment if line.startswith('-->'): break xml.append(line) # Get the root tag to close everything up root_tag = xml[1].strip().strip('<>') # add the closing tag and join, using the 4: slice to strip off block comment xml = ''.join((*xml, f'</{root_tag}>'))[4:] html = ''.join(html) 现在您应该能够使用您选择的解析器独立解析它们 你已经走上了正确的道路。我将您的 HTML 放入文件中,它工作正常,如下所示。 import xml.etree.ElementTree as ET with open('extract_xml.html') as handle: content = handle.read() xml = content[content.index('<!--')+4: content.index('-->')] document = ET.fromstring(xml) for element in document.findall("./mytag"): for child in element: print(child, child.text) 如果你一次一行地阅读文件,你会发现这更容易管理。 import xml.etree.ElementTree as ET START_COMMENT = '<!--' END_COMMENT = '-->' def getxml(filename): with open(filename) as data: lines = [] inxml = False for line in data.readlines(): if inxml: if line.startswith(END_COMMENT): inxml = False else: lines.append(line) elif line.startswith(START_COMMENT): inxml = True return ''.join(lines) ET.fromstring(xml := getxml('/Volumes/G-Drive/foo.html')) print(xml) 输出: <ROOTTAG> <mytag> <headername>BASE</headername> <fieldname>NAME</fieldname> <val><![CDATA[Testcase]]></val> </mytag> <mytag> <headername>BASE</headername> <fieldname>AGE</fieldname> <val><![CDATA[5]]></val> </mytag> </ROOTTAG> 随着 html.parser() (Doc) 中的构建,您可以将 xml 注释作为字符串获取,您可以使用 xml.entree.ElementTree 进行解析: from html.parser import HTMLParser import xml.etree.ElementTree as ET class MyHTMLParser(HTMLParser): def handle_comment(self, data): xml_str = data tree = ET.fromstring(xml_str) for elem in tree.iter(): print(elem.tag, elem.text) parser = MyHTMLParser() with open("your.html", "r") as f: lines = f.readlines() for line in lines: parser.feed(line) 输出: ROOTTAG mytag headername BASE fieldname NAME val Testcase mytag headername BASE fieldname AGE val 5

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.