将库元素添加到现有XML文件中

发布于 2025-02-14 00:21:51 字数 5034 浏览 1 评论 0原文

XML文件是:

    <?xml version="1.0"?>
<sdk:sdk-addon
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdk="http://schemas.android.com/sdk/android/addon/7">
    <sdk:add-on>
        <sdk:vendor-id>vendor1</sdk:vendor-id>
        <sdk:vendor-display>vendor1</sdk:vendor-display>
        <sdk:name-id>vendor1_apis</sdk:name-id>
        <sdk:name-display>vendor1 Z2 SDK Add-On</sdk:name-display>
        <sdk:description>SDK Add-On for the Z2 Platform</sdk:description>
        <sdk:api-level>30</sdk:api-level>
        <sdk:revision>1</sdk:revision>
        <sdk:libs>
        </sdk:libs>
        <sdk:archives>
            <sdk:archive>
                <sdk:size>84287</sdk:size>
                <sdk:checksum type='sha1'>7825e75aa697841fe0fe5b9438ca44792c1786d0</sdk:checksum>
                <sdk:url>z2_sdk_addon-eng.jenkins-linux-x86.zip</sdk:url>
        <sdk:host-os>linux</sdk:host-os>
            </sdk:archive>
        </sdk:archives>
    </sdk:add-on>
</sdk:sdk-addon>

库文件是:

library1
library2

输出应该是:

    <?xml version="1.0"?>
<sdk:sdk-addon
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdk="http://schemas.android.com/sdk/android/addon/7">
    <sdk:add-on>
        <sdk:vendor-id>vendor1</sdk:vendor-id>
        <sdk:vendor-display>vendor1</sdk:vendor-display>
        <sdk:name-id>vendor1_apis</sdk:name-id>
        <sdk:name-display>vendor1 Z2 SDK Add-On</sdk:name-display>
        <sdk:description>SDK Add-On for the Z2 Platform</sdk:description>
        <sdk:api-level>30</sdk:api-level>
        <sdk:revision>1</sdk:revision>
        <sdk:libs>
          <sdk:lib>
           <sdk:name>libray1</sdk:name>
          </sdk:lib>
              <sdk:lib>
           <sdk:name>libray2</sdk:name>
          </sdk:lib>
        </sdk:libs>
        <sdk:archives>
            <sdk:archive>
                <sdk:size>84287</sdk:size>
                <sdk:checksum type='sha1'>7825e75aa697841fe0fe5b9438ca44792c1786d0</sdk:checksum>
                <sdk:url>z2_sdk_addon-eng.jenkins-linux-x86.zip</sdk:url>
        <sdk:host-os>linux</sdk:host-os>
            </sdk:archive>
        </sdk:archives>
    </sdk:add-on>
</sdk:sdk-addon>

我创建了一个shell脚本,该脚本创建文本

 <sdk:lib>
   <sdk:name>libray1</sdk:name>
  </sdk:lib>
      <sdk:lib>
   <sdk:name>libray2</sdk:name>
  </sdk:lib>

,并尝试使用Python代码直接添加结果文本。

from lxml import etree
root = etree.parse('my.xml').getroot()
#print(root)
#print(etree.tostring(root))
libraries = root.find(".//{http://schemas.android.com/sdk/android/addon/7}libs")

print(libraries)



with open('libraries_to_be_added_xml') as libraries_to_be_added_file:
    text=libraries_to_be_added_file.read()
    libraries.text=str(text)

tree = etree.ElementTree(root)
tree.write("my.xml", encoding="UTF-8", xml_declaration=True, standalone=True)

我获得的输出具有&amp; gt; sdk:lib&amp; lt;而不是&lt; sdk:lib&gt;

输出我正在获取

    <?xml version="1.0"?>
<sdk:sdk-addon
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdk="http://schemas.android.com/sdk/android/addon/7">
    <sdk:add-on>
        <sdk:vendor-id>vendor1</sdk:vendor-id>
        <sdk:vendor-display>vendor1</sdk:vendor-display>
        <sdk:name-id>vendor1_apis</sdk:name-id>
        <sdk:name-display>vendor1 Z2 SDK Add-On</sdk:name-display>
        <sdk:description>SDK Add-On for the Z2 Platform</sdk:description>
        <sdk:api-level>30</sdk:api-level>
        <sdk:revision>1</sdk:revision>
        <sdk:libs>
          &gt;sdk:lib&lt;
           &gt;sdk:name&lt;libray1&gt;/sdk:name&lt;
          &gt;/sdk:lib&lt;
              &gt;sdk:lib&lt;
           &gt;sdk:name&lt;libray2&gt;/sdk:name&lt;
          &gt;/sdk:lib&lt;
        </sdk:libs>
        <sdk:archives>
            <sdk:archive>
                <sdk:size>84287</sdk:size>
                <sdk:checksum type='sha1'>7825e75aa697841fe0fe5b9438ca44792c1786d0</sdk:checksum>
                <sdk:url>z2_sdk_addon-eng.jenkins-linux-x86.zip</sdk:url>
        <sdk:host-os>linux</sdk:host-os>
            </sdk:archive>
        </sdk:archives>
    </sdk:add-on>
</sdk:sdk-addon>

Xml file is:

    <?xml version="1.0"?>
<sdk:sdk-addon
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdk="http://schemas.android.com/sdk/android/addon/7">
    <sdk:add-on>
        <sdk:vendor-id>vendor1</sdk:vendor-id>
        <sdk:vendor-display>vendor1</sdk:vendor-display>
        <sdk:name-id>vendor1_apis</sdk:name-id>
        <sdk:name-display>vendor1 Z2 SDK Add-On</sdk:name-display>
        <sdk:description>SDK Add-On for the Z2 Platform</sdk:description>
        <sdk:api-level>30</sdk:api-level>
        <sdk:revision>1</sdk:revision>
        <sdk:libs>
        </sdk:libs>
        <sdk:archives>
            <sdk:archive>
                <sdk:size>84287</sdk:size>
                <sdk:checksum type='sha1'>7825e75aa697841fe0fe5b9438ca44792c1786d0</sdk:checksum>
                <sdk:url>z2_sdk_addon-eng.jenkins-linux-x86.zip</sdk:url>
        <sdk:host-os>linux</sdk:host-os>
            </sdk:archive>
        </sdk:archives>
    </sdk:add-on>
</sdk:sdk-addon>

Libraries file is:

library1
library2

Output should be:

    <?xml version="1.0"?>
<sdk:sdk-addon
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdk="http://schemas.android.com/sdk/android/addon/7">
    <sdk:add-on>
        <sdk:vendor-id>vendor1</sdk:vendor-id>
        <sdk:vendor-display>vendor1</sdk:vendor-display>
        <sdk:name-id>vendor1_apis</sdk:name-id>
        <sdk:name-display>vendor1 Z2 SDK Add-On</sdk:name-display>
        <sdk:description>SDK Add-On for the Z2 Platform</sdk:description>
        <sdk:api-level>30</sdk:api-level>
        <sdk:revision>1</sdk:revision>
        <sdk:libs>
          <sdk:lib>
           <sdk:name>libray1</sdk:name>
          </sdk:lib>
              <sdk:lib>
           <sdk:name>libray2</sdk:name>
          </sdk:lib>
        </sdk:libs>
        <sdk:archives>
            <sdk:archive>
                <sdk:size>84287</sdk:size>
                <sdk:checksum type='sha1'>7825e75aa697841fe0fe5b9438ca44792c1786d0</sdk:checksum>
                <sdk:url>z2_sdk_addon-eng.jenkins-linux-x86.zip</sdk:url>
        <sdk:host-os>linux</sdk:host-os>
            </sdk:archive>
        </sdk:archives>
    </sdk:add-on>
</sdk:sdk-addon>

I created a shell script that creates a text

 <sdk:lib>
   <sdk:name>libray1</sdk:name>
  </sdk:lib>
      <sdk:lib>
   <sdk:name>libray2</sdk:name>
  </sdk:lib>

And tried directly adding the result text using python code

from lxml import etree
root = etree.parse('my.xml').getroot()
#print(root)
#print(etree.tostring(root))
libraries = root.find(".//{http://schemas.android.com/sdk/android/addon/7}libs")

print(libraries)



with open('libraries_to_be_added_xml') as libraries_to_be_added_file:
    text=libraries_to_be_added_file.read()
    libraries.text=str(text)

tree = etree.ElementTree(root)
tree.write("my.xml", encoding="UTF-8", xml_declaration=True, standalone=True)

The output I am getting has >sdk:lib< instead of <sdk:lib>

Output I am getting

    <?xml version="1.0"?>
<sdk:sdk-addon
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdk="http://schemas.android.com/sdk/android/addon/7">
    <sdk:add-on>
        <sdk:vendor-id>vendor1</sdk:vendor-id>
        <sdk:vendor-display>vendor1</sdk:vendor-display>
        <sdk:name-id>vendor1_apis</sdk:name-id>
        <sdk:name-display>vendor1 Z2 SDK Add-On</sdk:name-display>
        <sdk:description>SDK Add-On for the Z2 Platform</sdk:description>
        <sdk:api-level>30</sdk:api-level>
        <sdk:revision>1</sdk:revision>
        <sdk:libs>
          >sdk:lib<
           >sdk:name<libray1>/sdk:name<
          >/sdk:lib<
              >sdk:lib<
           >sdk:name<libray2>/sdk:name<
          >/sdk:lib<
        </sdk:libs>
        <sdk:archives>
            <sdk:archive>
                <sdk:size>84287</sdk:size>
                <sdk:checksum type='sha1'>7825e75aa697841fe0fe5b9438ca44792c1786d0</sdk:checksum>
                <sdk:url>z2_sdk_addon-eng.jenkins-linux-x86.zip</sdk:url>
        <sdk:host-os>linux</sdk:host-os>
            </sdk:archive>
        </sdk:archives>
    </sdk:add-on>
</sdk:sdk-addon>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

究竟谁懂我的在乎 2025-02-21 00:21:51

您将文本添加到XML节点&lt; sdk:libs&gt;。这就是为什么文本被逃脱的原因,因此不会破坏XML文档。

如果是elementTree:

# Create a lib element with a subelement
sdk_lib = ET.Element('{http://schemas.android.com/sdk/android/addon/7}lib')
sdk_name = ET.SubElement(sdk_lib, '{http://schemas.android.com/sdk/android/addon/7}name')
sdk_name.text = 'Library 1'

# Adds the sdk_lib element to your <sdk:libs> element
libraries.append(sdk_lib)

相关文档: https://docs.python.org/3/library/xml.etree.elementtree.html

You are adding text to the xml node <sdk:libs>. Thats why the text gets escaped, so it does not break the xml document.

You need to work with xml elements, in the case of ElementTree:

# Create a lib element with a subelement
sdk_lib = ET.Element('{http://schemas.android.com/sdk/android/addon/7}lib')
sdk_name = ET.SubElement(sdk_lib, '{http://schemas.android.com/sdk/android/addon/7}name')
sdk_name.text = 'Library 1'

# Adds the sdk_lib element to your <sdk:libs> element
libraries.append(sdk_lib)

Relevant documentation: https://docs.python.org/3/library/xml.etree.elementtree.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文