【问题标题】:add contents inside root tag of xml file在xml文件的根标签内添加内容
【发布时间】:2018-04-23 07:58:17
【问题描述】:

我有一个现有的 xml 文件并想向其中添加一些内容。

现有的xml文件:

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
    <edmx:Reference Uri="/redfish/v1/Schemas/Resource_v1.xml">
        <edmx:Include Namespace="Resource"/>
        <edmx:Include Namespace="Resource.v1_0_0"/>
        <edmx:Include Namespace="Resource.v1_0_2"/>
        <edmx:Include Namespace="Resource.v1_4_0"/>
    </edmx:Reference>
    <edmx:DataServices>
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Service">
            <EntityContainer Name="Service" Extends="ServiceRoot.v1_0_0.ServiceContainer"/>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

现在我想在不修改现有文件内容的情况下添加以下内容

我的问题是如何在不修改此标签内现有 xml 文件的内容的情况下将 xml 的内容添加到现有文件中:&lt;edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0"&gt;

我试过这段代码:

new="""<edmx:Reference Uri="/redfish/v1/Schemas/Chassis_v1.xml">
<edmx:Include Namespace="Chassis"/>
<edmx:Include Namespace="Chassis.v1_0_0"/>
<edmx:Include Namespace="Chassis.v1_0_1"/>
</edmx:Reference>"""


tree = ET.parse('metadata.xml')
root = tree.getroot()

ET.register_namespace('edmx','http://docs.oasis-open.org/odata/ns/edmx')
ET.register_namespace('','http://docs.oasis-open.org/odata/ns/edm')
root.text = new

print ET.tostring(root,method="html")

但是输出是:

<edmx:Edmx xmlns="http://docs.oasis-open.org/odata/ns/edm" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">&lt;edmx:Reference Uri="/redfish/v1/Schemas/Chassis_v1.xml"&gt;
&lt;edmx:Include Namespace="Chassis"/&gt;
&lt;edmx:Include Namespace="Chassis.v1_0_0"/&gt;
&lt;edmx:Include Namespace="Chassis.v1_0_1"/&gt;
&lt;/edmx:Reference&gt;<edmx:Reference Uri="/redfish/v1/Schemas/Resource_v1.xml">
        <edmx:Include Namespace="Resource"></edmx:Include>
        <edmx:Include Namespace="Resource.v1_0_0"></edmx:Include>
        <edmx:Include Namespace="Resource.v1_0_2"></edmx:Include>
        <edmx:Include Namespace="Resource.v1_4_0"></edmx:Include>
    </edmx:Reference>
    <edmx:DataServices>
        <Schema Namespace="Service">
            <EntityContainer Extends="ServiceRoot.v1_0_0.ServiceContainer" Name="Service"></EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

【问题讨论】:

  • 下面的答案是你的预期输出吗?

标签: python xml-parsing


【解决方案1】:

由于您必须在 parent/root 属性中添加内容,因此此代码将添加您的内容:

新内容:

new="""<edmx:Reference Uri="/redfish/v1/Schemas/Chassis_v1.xml">
<edmx:Include Namespace="Chassis"/>
<edmx:Include Namespace="Chassis.v1_0_0"/>
<edmx:Include Namespace="Chassis.v1_0_1"/>
</edmx:Reference>"""

代码:

from xml.etree.ElementTree import parse, Element
xml_doc = parse('metadata.xml') #parse xml file here
root = xml_doc.getroot()  #get root element here...
root.append(Element(new)) #new element/attribute you want to get 
xml_doc.write('metadata.xml', xml_declaration=True)

输出 metadata.xml 如下:

<ns0:Edmx xmlns:ns0="http://docs.oasis-open.org/odata/ns/edmx" xmlns:ns1="http://docs.oasis-open.org/odata/ns/edm" Version="4.0">
    <ns0:Reference Uri="/redfish/v1/Schemas/Resource_v1.xml">
        <ns0:Include Namespace="Resource" />
        <ns0:Include Namespace="Resource.v1_0_0" />
        <ns0:Include Namespace="Resource.v1_0_2" />
        <ns0:Include Namespace="Resource.v1_4_0" />
    </ns0:Reference>
    <ns0:DataServices>
        <ns1:Schema Namespace="Service">
            <ns1:EntityContainer Extends="ServiceRoot.v1_0_0.ServiceContainer" Name="Service" />
        </ns1:Schema>
    </ns0:DataServices>
    <!-- added new content here -->
<<edmx:Reference Uri="/redfish/v1/Schemas/Chassis_v1.xml">
<edmx:Include Namespace="Chassis"/>
<edmx:Include Namespace="Chassis.v1_0_0"/>
<edmx:Include Namespace="Chassis.v1_0_1"/>
</edmx:Reference> /></ns0:Edmx>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多