【发布时间】:2022-01-06 11:08:43
【问题描述】:
我已经使用下面的代码解析并存储了一个 xml 文件作为文档对象。
import xml.dom.minidom as DOM
import shutil
import xml.etree.ElementTree as ET
metadata_path=r"C:\Users\ar\DD2MI_result.xml"
new_metadata=DOM.parse(metadata_path)
现在我想用这个完整的文档对象来替换另一个xml文件中子节点的数据。我能够像这样获得子节点:
output_draft = r"C:\Users\ar\airquality.xml"
doc = DOM.parse(output_draft)
meta=doc.getElementsByTagName('XmlDoc')
for metadata in meta:
if metadata.firstChild.data:
metadata.firstChild.replaceData(0,len(new_metadata),new_metadata)
print (metadata.firstChild.data)
当我运行上面的代码时,我得到了错误,TypeError: object of type 'Document' has no len() 我理解它是一个对象。如何使用完整的对象或文件来替换当前内容?
airquality.xml
<?xml version="1.0" encoding="UTF-8"?>
<gmd:MD_Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gco="http://www.isotc211.org/2005/gco"
xmlns:gmd="http://www.isotc211.org/2005/gmd"
xmlns:srv="http://www.isotc211.org/2005/srv"
xmlns:gmx="http://www.isotc211.org/2005/gmx"
xmlns:gsr="http://www.isotc211.org/2005/gsr"
xmlns:gss="http://www.isotc211.org/2005/gss"
xmlns:gts="http://www.isotc211.org/2005/gts"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd">
<gmd:fileIdentifier>
<gco:CharacterString>https://hdl.handle.net/20.500.12085/1f97f2a1-75fc-4110-ae22-f873d7d86565@metadata</gco:CharacterString>
</gmd:fileIdentifier>
<gmd:language>
<gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="eng">eng</gmd:LanguageCode>
</gmd:language>
</gmd:MD_Metadata>
替换前的DD2MI_result.xml
<SVCManifest xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="typens:SVCManifest">
<Databases xsi:type="typens:ArrayOfSVCDatabase" />
<Resources xsi:type="typens:ArrayOfSVCResource">
<SVCResource xsi:type="typens:SVCResource">
<ID>{429221BF-D0A1-40D8-9DC1-B41D269E95C7}</ID>
<Name>test.crf</Name>
<Metadata xsi:type="typens:XmlPropertySet">
<XmlDoc><?xml version="1.0"?>
<metadata xml:lang="en"><Esri><CreaDate>20211219</metadata>
</XmlDoc>
</Metadata>
</SVCManifest>
替换后的DD2MI_result.xml
<SVCManifest xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="typens:SVCManifest">
<Databases xsi:type="typens:ArrayOfSVCDatabase" />
<Resources xsi:type="typens:ArrayOfSVCResource">
<SVCResource xsi:type="typens:SVCResource">
<ID>{429221BF-D0A1-40D8-9DC1-B41D269E95C7}</ID>
<Name>test.crf</Name>
<Metadata xsi:type="typens:XmlPropertySet">
<XmlDoc><?xml version="1.0" encoding="UTF-8"?>
<gmd:MD_Metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gco="http://www.isotc211.org/2005/gco"
xmlns:gmd="http://www.isotc211.org/2005/gmd"
xmlns:srv="http://www.isotc211.org/2005/srv"
xmlns:gmx="http://www.isotc211.org/2005/gmx"
xmlns:gsr="http://www.isotc211.org/2005/gsr"
xmlns:gss="http://www.isotc211.org/2005/gss"
xmlns:gts="http://www.isotc211.org/2005/gts"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd">
<gmd:fileIdentifier>
<gco:CharacterString>https://hdl.handle.net/20.500.12085/1f97f2a1-75fc-4110-ae22-f873d7d86565@metadata</gco:CharacterString>
</gmd:fileIdentifier>
<gmd:language>
<gmd:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="eng">eng</gmd:LanguageCode>
</gmd:language>
</gmd:MD_Metadata>
</XmlDoc>
</Metadata>
</SVCManifest>
【问题讨论】:
-
请编辑您的问题并在替换前后添加
DD2MI_result.xml和airquality.xml的简化版本。 -
@JackFleeting 我已经添加了简化版的文件
-
由于多种原因,您问题中的
DD2MI_result.xml格式不正确。特别有问题的是<XmlDoc>&lt;?xml version="1.0"?&gt; &lt;metadata xml:lang="en"&gt;&lt;Esri&gt;&lt;CreaDate&gt;20211219&lt;/metadata&gt;</XmlDoc>。请重新检查。另请注意,您不能在同一个 xml 文件中包含两个 xml 声明,这会使您的问题中的预期输出也不是格式正确的。 -
@JackFleeting 我更新了代码。
DD2MI_result.xml文件是一个清单文件,但可以像普通 xml 文件一样对其进行操作。您提到的第一个问题不是问题,因为元素中的内容实际上引用了文件中的其他元素,这就是为什么它显示很多&。我只想删除所有这些内容并将其替换为其他文件的内容。至于第二个问题,我在上面的例子中已经解决了,我错误地做了多个声明。开始时没有声明。 -
替换后的标记格式不正确,因此不是 XML。特别是 XML 标头,
<?xml ...?>必须是第一行,或者如果是嵌入式 XML,则必须将其标记符号替换为 XML 实体(如原始文档)。甚至可以考虑将CData用于嵌入式文档!