ElementTree是一个用于创建和解析XML的Python库。
我正在尝试创建一个程序,该程序允许我接收人员信息,然后将其写入 xml 文档,保存它,然后一旦程序再次运行,它将从我离开的位置开始。 ..
xml.etree.ElementTree 将 xml 文件中的双标签转换为单标签
我的意思是如何使用 ElementTree 将 MyBro 标签从双标签转换为单标签? 来自:史蒂夫 至: 附:问我做了什么?搜索了文档和整个
我有一个如下所示的 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
无法在 python xml.etree.ElementTree 中找到访问 XPath 中的元素
我一直在兜圈子。我的任务是读取 xml 文档。解析记录以查找 ID。使用该 ID 执行一些 SQL。然后将 xml 的值与 SQL 的值进行比较。如果...
我有一个如下所示的 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") 还有更好的方法吗?
我想使用python和xml文件对系统进行故障树分析,但我找不到足够的材料来帮助我。 假设我有一个简单的 xml 文件,其中包含 Top 事件和 OR 逻辑门
在此代码中,打印(计数)语句也未显示,也没有创建 xml 文件。为什么未创建 xml 文件是 raise 语句的问题。 代码 - - - 导入操作系统 导入 xml.etree.ElementTree 作为 ET
我正在向 URL 发出请求,在我收到的 xml 响应中,xmlns 属性命名空间会不时发生变化。因此,当我对命名空间进行硬编码时,找到一个元素将返回 None 。请他...
我正在尝试解析 xml 字符串,我只想要 PackageReference Include 属性详细信息及其版本。当我说 ET.fromstring(xml) 时,它会给出类似 xml.etree.ElementTree.Pars 的错误...
尝试解析 xml 会抛出 FileNotFoundError
Python 新手,我所做的就是解析一个简单的 xml 字符串。但是当我这样做时,Et.parse 上显示“没有这样的文件或目录”。我也尝试说 Et.parse(Et.fromstring(xmlfile)) 但仍然......
调用 ElementTree.parse 时出现“XML 或文本声明不在实体开头:第 2 行,第 0 列”
ElementTree.parse() 在下面的简单示例中失败并出现错误 xml.etree.ElementTree.ParseError:XML 或文本声明不在实体开头:第 2 行,第 0 列 XML 看起来有效并且
如何使用 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')
使用 ElemTree Python 从 xml 标签和标签的可选子元素中获取文本元素
我有一个 xml 文档(保存在我的驱动器上): xml=""" 这里有一些文字 ...
我想更改 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新手,如果这是一个非常明显的问题,我深表歉意。
使用 root.iter 使用 Python 解析 xml 文件不会列出文本
我正在尝试使用Python来解析xml文件。我想识别指定 xml 标签之间出现的文本。 我正在运行的代码是 导入 xml.etree.ElementTree 作为 ET 树 = ET.parse('
我正在使用 xml.etree 模块来解析 xml 文件。 在处理元素树时,我需要对其中的节点进行操作,而不更改树中存储的数据。因此我想复制节点...
我有一个 XML 格式的标记文本。我需要添加标记,即为文本中出现的某些词添加标签。 这就是我正在尝试的方式: 将 xml.etree.ElementTree 导入为 ET 文件 = ...
使用 import lxml.etree as ElementTree 抓取 xml 数据的最有效方法是什么
我正在尝试学习如何使用 XML 抓取网站。我对 html 非常熟悉,但我注意到我尝试抓取的一些网站具有 XML API。如果我没记错的话,它会更快、更快……
就我而言,我有以下代码: 从 lxml 导入 etree as et 从 lxml.builder 导入 ElementMaker WSS_SCHEMA = "http://schemas.xmlsoap.org/ws/2002/12/secext" ACTOR_SCHEMA = "...
我有一个 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