首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中注释xml的整个块和单个标记?

如何在python中注释xml的整个块和单个标记?
EN

Stack Overflow用户
提问于 2020-04-08 04:22:44
回答 1查看 208关注 0票数 0

如何在python中注释整个特定的块和特定的xml标记?在下面的xml中,有许多<list>标记。1)必须对整个块<list> {some_data}</list>进行注释,其中<list name="list_name1"> 2)如果您观察到<list name="list_name3">,则<item>中有2 <p> tags

代码语言:javascript
复制
<p name="address1">some/address-3</p><p name="address1_1">some/address-1_1</p>

这里,必须注释第二个<p> tag,即<p name="address1_1">some/address-1_1</p>,所有这些实例。

代码语言:javascript
复制
How can we achieve this in python ?
Which is best xml module in python ?

sample_file.xml

代码语言:javascript
复制
    <raml xmlns="abcd.xsd" version="0.1">
    <newData type="hw">
        <header>
          <log action="create" dateTime="2020-01-15T16:45:12.001Z" />
        </header>
        <sampleObject class="com.abcd.efgh:VASDF" distName="some_unique_name" operation="update" version="HDGEKB_8363_845"> 
            <p name="p_name1">true</p>
            <list name="list_name1">
                <item>
                    <p name="address1">some/address-1</p>
                    <p name="value">some/value-1</p>
                </item>
                <item>
                    <p name="address1">some/address-2</p>
                    <p name="value">some/value-2</p>
                </item>
                <item>
                    <p name="address1">some/address-3</p>
                    <p name="value">some/value-3</p>
                </item>
                <item>
                    <p name="address1">some/address-4</p>
                    <p name="value">some/value-4</p>
                </item>
                <item>
                    <p name="address1">some/address-5</p>
                    <p name="value">some/value-5</p>
                </item>
                <item>
                    <p name="address1">some/address-6</p>
                    <p name="value">some/value-6</p>
                </item>
            </list>
            <list name="list_name2">
                <item>
                    <p name="address1">some/address-1</p>
                    <p name="value">1</p>
                </item>
                <item>
                    <p name="address1">some/address-2</p>
                    <p name="value">2</p>
                </item>
                <item>
                    <p name="address1">some/address-3</p>
                    <p name="value">3</p>
                </item>
                <item>
                    <p name="address1">some/address-4</p>
                    <p name="value">4</p>
                </item>
                <item>
                    <p name="address1">some/address-5</p>
                    <p name="value">5</p>
                </item>
                <item>
                    <p name="address1">some/address-6</p>
                    <p name="value">6</p>
                </item>
            </list>
            <list name="list_name3">
                <item>
                    <p name="address1">some/address-1</p>
                    <p name="address1_1">some/address-1_1</p>
                    <p name="value">1</p>
                </item>
                <item>
                    <p name="address1_1">some/address-1_1</p>
                    <p name="value">1_1</p>
                <item>
                <item>
                    <p name="address1">some/address-2</p>
                    <p name="value">2</p>
                </item>
                <item>
                    <p name="address1">some/address-3</p>
                    <p name="address1_1">some/address-1_1</p>
                    <p name="value">3</p>
                </item>
                <item>
                    <p name="address1_1">some/address-1_1</p>
                    <p name="value">3_3</p>
                <item>
                <item>
                    <p name="address1">some/address-4</p>
                    <p name="value">4</p>
                </item>
                <item>
                    <p name="address1">some/address-5</p>
                    <p name="value">5</p>
                </item>
                <item>
                    <p name="address1">some/address-6</p>
                    <p name="value">6</p>
                </item>
             </list>                                                                
        </sampleObject> 
    </newData>

</raml>

output_file.xml,应该如下所示

代码语言:javascript
复制
<raml xmlns="abcd.xsd" version="0.1">
    <newData type="hw">
        <header>
          <log action="create" dateTime="2020-01-15T16:45:12.001Z" />
        </header>
        <sampleObject class="com.abcd.efgh:VASDF" distName="some_unique_name" operation="update" version="HDGEKB_8363_845"> 
            <p name="p_name1">true</p>
            <!--<list name="list_name1">
                <item>
                    <p name="address1">some/address-1</p>
                    <p name="value">some/value-1</p>
                </item>
                <item>
                    <p name="address1">some/address-2</p>
                    <p name="value">some/value-2</p>
                </item>
                <item>
                    <p name="address1">some/address-3</p>
                    <p name="value">some/value-3</p>
                </item>
                <item>
                    <p name="address1">some/address-4</p>
                    <p name="value">some/value-4</p>
                </item>
                <item>
                    <p name="address1">some/address-5</p>
                    <p name="value">some/value-5</p>
                </item>
                <item>
                    <p name="address1">some/address-6</p>
                    <p name="value">some/value-6</p>
                </item>
            </list> -->
            <list name="list_name2">
                <item>
                    <p name="address1">some/address-1</p>
                    <p name="value">1</p>
                </item>
                <item>
                    <p name="address1">some/address-2</p>
                    <p name="value">2</p>
                </item>
                <item>
                    <p name="address1">some/address-3</p>
                    <p name="value">3</p>
                </item>
                <item>
                    <p name="address1">some/address-4</p>
                    <p name="value">4</p>
                </item>
                <item>
                    <p name="address1">some/address-5</p>
                    <p name="value">5</p>
                </item>
                <item>
                    <p name="address1">some/address-6</p>
                    <p name="value">6</p>
                </item>
            </list>
            <list name="list_name3">
                <item>
                    <p name="address1">some/address-1</p>
                    <!--<p name="address1_1">some/address-1_1</p>-->
                    <p name="value">1</p>
                </item>
                <item>
                    <p name="address1_1">some/address-1_1</p>
                    <p name="value">1_1</p>
                <item>
                <item>
                    <p name="address1">some/address-2</p>
                    <p name="value">2</p>
                </item>
                <item>
                    <p name="address1">some/address-3</p>
                    <!--<p name="address1_1">some/address-1_1</p>-->
                    <p name="value">3</p>
                </item>
                <item>
                    <p name="address1_1">some/address-1_1</p>
                    <p name="value">3_3</p>
                <item>
                <item>
                    <p name="address1">some/address-4</p>
                    <p name="value">4</p>
                </item>
                <item>
                    <p name="address1">some/address-5</p>
                    <p name="value">5</p>
                </item>
                <item>
                    <p name="address1">some/address-6</p>
                    <p name="value">6</p>
                </item>
             </list>                                                                
        </sampleObject> 
    </newData>

</raml>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-08 19:31:33

lxml可以用其他元素(包括注释)替换任何元素,但不幸的是,如果您从现有元素创建该注释的文本,lxml将再次将默认命名空间复制到注释文本中。

因此,我决定不使用lxml,而是使用BeautifulSoup,它更“从宽”地对待名称空间。

试试下面的代码:

代码语言:javascript
复制
from bs4 import BeautifulSoup, Comment

soup = BeautifulSoup(open('Input.xml'), 'xml')
for elem in soup.findAll('list'):
    elem.replace_with(Comment(str(elem)))
print(soup.prettify())

对于您的输入XML,缩短一点,我得到:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<raml version="0.1" xmlns="abcd.xsd">
  <newData type="hw">
    <header>
      <log action="create" dateTime="2020-01-15T16:45:12.001Z"/>
    </header>
    <sampleObject class="com.abcd.efgh:VASDF" distName="some_unique_name" operation="update" version="HDGEKB_8363_845">
      <p name="p_name1">true</p>
<!--<list name="list_name1">
<item>
<p name="address1">some/address-1</p>
<p name="value">1</p>
</item>
<item>
<p name="address1">some/address-2</p>
<p name="value">2</p>
</item>
</list>-->
<!--<list name="list_name2">
<item>
<p name="address1">some/address-3</p>
<p name="value">3</p>
</item>
<item>
<p name="address1">some/address-4</p>
<p name="value">4</p>
</item>
</list>-->
    </sampleObject>
  </newData>
</raml>

编辑

如果您只想注释掉一个list元素(例如,将name属性设置为'list_name1'),则更正很简单:

findAll有另一个参数,即attrs (字典),在这里您可以传递任何属性名/值以缩小选择范围。

在这种情况下,将循环更改为:

代码语言:javascript
复制
for elem in soup.findAll('list', attrs={'name': 'list_name1'}):
    elem.replace_with(Comment(str(elem)))

要只删除选定的元素,要做的方法的名称就不那么直观了,即它是分解的。

要做到这一点,请跑:

代码语言:javascript
复制
for elem in soup.findAll('list', attrs={'name': 'list_name1'}):
    elem.decompose()

在有关XML前缀的注释后面编辑

删除XML前缀的一个方法是调用BeautifulSoup 而不使用第二个xml参数。

但是输出中的根元素是html,其中包含body元素,raml元素在其中。

因此,要删除这两个“外部”元素,请将代码更改为:

代码语言:javascript
复制
soup = BeautifulSoup(open('Input.xml'))
for elem in soup.findAll('list'):
    elem.replace_with(Comment(str(elem)))
print(soup.html.body.raml.prettify())

例如,<p>元素保存在的单个行中。

有点“肮脏”的解决方案,但希望能带来预期的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61093298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档