lxml:将命名空间添加到输入文件

2024-01-17

我正在解析由外部生成的 xml 文件program http://celldesigner.org/。然后,我想使用我自己的命名空间向该文件添加自定义注释。我的输入如下所示:

<sbml xmlns="http://www.sbml.org/sbml/level2/version4" xmlns:celldesigner="http://www.sbml.org/2001/ns/celldesigner" level="2" version="4">
  <model metaid="untitled" id="untitled">
    <annotation>...</annotation>
    <listOfUnitDefinitions>...</listOfUnitDefinitions>
    <listOfCompartments>...</listOfCompartments>
    <listOfSpecies>
      <species metaid="s1" id="s1" name="GenA" compartment="default" initialAmount="0">
        <annotation>
          <celldesigner:extension>...</celldesigner:extension>
        </annotation>
      </species>
      <species metaid="s2" id="s2" name="s2" compartment="default" initialAmount="0">
        <annotation>
           <celldesigner:extension>...</celldesigner:extension>
        </annotation>
      </species>
    </listOfSpecies>
    <listOfReactions>...</listOfReactions>
  </model>
</sbml>

问题是 lxml 仅在使用时声明名称空间,这意味着声明会重复多次,如下所示(简化):

<sbml xmlns="namespace" xmlns:celldesigner="morenamespace" level="2" version="4">
  <listOfSpecies>
    <species>
      <kjw:test xmlns:kjw="http://this.is.some/custom_namespace"/>
      <celldesigner:data>Some important data which must be kept</celldesigner:data>
    </species>
    <species>
      <kjw:test xmlns:kjw="http://this.is.some/custom_namespace"/>
    </species>
    ....
  </listOfSpecies>
</sbml>

是否可以强制lxml在父元素中仅写入一次此声明,例如sbml or listOfSpecies?或者有充分的理由不这样做吗?我想要的结果是:

<sbml xmlns="namespace" xmlns:celldesigner="morenamespace" level="2" version="4"  xmlns:kjw="http://this.is.some/custom_namespace">
  <listOfSpecies>
    <species>
      <kjw:test/>
      <celldesigner:data>Some important data which must be kept</celldesigner:data>
    </species>
    <species>
      <kjw:test/>
    </species>
    ....
  </listOfSpecies>
</sbml>

重要的问题是必须保留从文件中读取的现有数据,因此我不能只创建一个新的根元素(我认为?)。

编辑:下面附有代码。

def annotateSbml(sbml_input):
  from lxml import etree

  checkSbml(sbml_input) # Makes sure the input is valid sbml/xml.

  ns = "http://this.is.some/custom_namespace"
  etree.register_namespace('kjw', ns)

  sbml_doc = etree.ElementTree()
  root = sbml_doc.parse(sbml_input, etree.XMLParser(remove_blank_text=True))
  nsmap = root.nsmap
  nsmap['sbml'] = nsmap[None] # Makes code more readable, but seems ugly. Any alternatives to this?
  nsmap['kjw'] = ns
  ns = '{' + ns + '}'
  sbmlns = '{' + nsmap['sbml'] + '}'

  for species in root.findall('sbml:model/sbml:listOfSpecies/sbml:species', nsmap):
    species.append(etree.Element(ns + 'test'))

  sbml_doc.write("test.sbml.xml", pretty_print=True, xml_declaration=True)

  return

在 lxml 中无法修改节点的命名空间映射。看这张公开票 https://bugs.launchpad.net/lxml/+bug/555602将此功能作为愿望清单项目。

它起源于这个线程 https://mailman-mail5.webfaction.com/pipermail/lxml/20100323/thread.html#13258在 lxml 邮件列表上,其中解决方法是替换根节点 https://mailman-mail5.webfaction.com/pipermail/lxml/20100323/013260.html被作为替代方案给出。不过,替换根节点存在一些问题:请参阅上面的票证。

为了完整起见,我将在此处放置建议的根替换解决方法代码:

>>> DOC = """<sbml xmlns="http://www.sbml.org/sbml/level2/version4" xmlns:celldesigner="http://www.sbml.org/2001/ns/celldesigner" level="2" version="4">
...   <model metaid="untitled" id="untitled">
...     <annotation>...</annotation>
...     <listOfUnitDefinitions>...</listOfUnitDefinitions>
...     <listOfCompartments>...</listOfCompartments>
...     <listOfSpecies>
...       <species metaid="s1" id="s1" name="GenA" compartment="default" initialAmount="0">
...         <annotation>
...           <celldesigner:extension>...</celldesigner:extension>
...         </annotation>
...       </species>
...       <species metaid="s2" id="s2" name="s2" compartment="default" initialAmount="0">
...         <annotation>
...            <celldesigner:extension>...</celldesigner:extension>
...         </annotation>
...       </species>
...     </listOfSpecies>
...     <listOfReactions>...</listOfReactions>
...   </model>
... </sbml>"""
>>> 
>>> from lxml import etree
>>> from StringIO import StringIO
>>> NS = "http://this.is.some/custom_namespace"
>>> tree = etree.ElementTree(element=None, file=StringIO(DOC))
>>> root = tree.getroot()
>>> nsmap = root.nsmap
>>> nsmap['kjw'] = NS
>>> new_root = etree.Element(root.tag, nsmap=nsmap)
>>> new_root[:] = root[:]
>>> new_root.append(etree.Element('{%s}%s' % (NS, 'test')))
>>> new_root.append(etree.Element('{%s}%s' % (NS, 'test')))

>>> print etree.tostring(new_root, pretty_print=True)
<sbml xmlns:celldesigner="http://www.sbml.org/2001/ns/celldesigner" xmlns:kjw="http://this.is.some/custom_namespace" xmlns="http://www.sbml.org/sbml/level2/version4"><model metaid="untitled" id="untitled">
    <annotation>...</annotation>
    <listOfUnitDefinitions>...</listOfUnitDefinitions>
    <listOfCompartments>...</listOfCompartments>
    <listOfSpecies>
      <species metaid="s1" id="s1" name="GenA" compartment="default" initialAmount="0">
        <annotation>
          <celldesigner:extension>...</celldesigner:extension>
        </annotation>
      </species>
      <species metaid="s2" id="s2" name="s2" compartment="default" initialAmount="0">
        <annotation>
           <celldesigner:extension>...</celldesigner:extension>
        </annotation>
      </species>
    </listOfSpecies>
    <listOfReactions>...</listOfReactions>
  </model>
<kjw:test/><kjw:test/></sbml>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lxml:将命名空间添加到输入文件 的相关文章

随机推荐

  • PyCharm删除参数字段中的引号

    我想使用 PyCharm 中的参数字段为 python 脚本设置参数 我的配置 但运行控制台中的命令是 python3 path to script py app id picoballoon network dev id ferdinan
  • DIV指令跳转到随机位置?

    所以我有这个确切的问题 https stackoverflow com questions 8236636 8086 assembly div going ape ip jumping to a weird location endless
  • 如何仅删除 Pandas 多索引数据框中的索引名称而不删除内容

    我有以下制表符分隔文件 mydata txt Set Coolthing Route Organ Up Down set4 foo ID LN 81 60 set4 bar ID LN 542 92 set4 foo ID LV 73 73
  • 在VS2010中找不到DataContractJsonSerializer

    我正在开发一个演示 Silverlight 应用程序 我想做一些简单的 JSON 我找到了System Runtime Serialization Json DataContractJsonSerializer http msdn micr
  • Objective C 检查文本字段是否为空

    这是代码 IBAction charlieInputText id sender getting value from text field when entered charlieInputSelf sender stringValue
  • 随机生成具有偏爱低值分布的整数

    我有一个按某些质量函数排序的列表 我想从中获取元素 更喜欢列表开头的好元素 目前 我生成随机索引的函数基本上如下所示 def pick p 0 2 for i in itertools count if random random lt p
  • Ubuntu Apache2 本地虚拟主机 url 未找到

    我正在设置我的笔记本电脑 使用 Ubuntu 16 10 上的 LAMP 堆栈进行多个站点的单用户开发 并为不同站点提供虚拟主机和基于名称的虚拟主机 我尝试了各种配置设置组合 但无法从浏览器加载站点 我收到 在此服务器上找不到请求的 URL
  • Groovy 压缩列表或按级别展平

    我正在尝试压缩两个列表 我找到了一个解决方案 使用transpose 来自此链接 Groovy 中是否有 Scala zip 函数的类似物 https stackoverflow com questions 13879489 is ther
  • 如何对数组列表<>求和

    我有一个 List myList 其中我知道所有 int 数组的长度相同 为了便于论证 我们假设我有 500 个数组 每个数组有 2048 个元素长 我想对所有 500 个数组求和 得到一个长度为 2048 个元素的数组 其中每个元素是所有
  • 仅当编辑器处于焦点状态时才显示 TextAngular 工具栏(对于具有 1 个工具栏的多个编辑器)

    我有多个编辑器和一个工具栏 最初我只有一个编辑器 然后通过单击工具栏中的按钮添加第二个和第三个编辑器 工具栏位于第一个编辑器的顶部 随后添加的编辑器堆叠在另一个编辑器的下面 我遇到的问题是 当任何编辑器处于焦点状态时 如何显示工具栏 如何将
  • 动态生成灵活数量的嵌套 for 循环[重复]

    这个问题在这里已经有答案了 是否可以根据输入的长度添加 减少函数中嵌套 for 循环的数量 例如 基于长度为 3 的某个输入 我可能需要使用 1 个嵌套 for 循环 for 循环位于另一个 for 循环内 与此类似 for i in ra
  • ReSharper 的静态分析器似乎已损坏。我如何解决它?

    我对 ReSharper 给出的建议明显错误感到有疑问 例如 在以下代码示例中 ReSharper 表示response dates and ex当变量在以下几行中明确使用时 永远不会使用它们 Dim response As New Wcf
  • 仅在 Safari 上单击/悬停/聚焦时出现意外行为 - 圆形图片变为方形?

    我有奇怪的行为 圆形图片在桌面和移动设备上变成方形 这似乎只发生在 safari 上 并且只有当我添加 CSS 过渡时才会发生 这是网站 https shmoss github io Gibbs Lab people html https
  • C# 方法声明中的 new

    public new int AdjustedBaseValue 这里的新是什么意思或做什么 这意味着您正在隐藏 int 值 它是在基类中声明的 并且您在派生类中重新声明它 从而有效地隐藏了基类版本 查看文档here https learn
  • CSS 外部样式表不起作用,但完全相同的 CSS 在内部样式表上工作

    在制作个人网站时 我遇到了添加 CSS 样式表的问题 该样式表是本地样式表 在同一文件夹中具有 htm 文件 名为 Rodrigo css Here is the HTML Link tag with the CSS in the hrc
  • 绕过截断的“ps”

    我正在尝试编写一个脚本 该脚本将根据关键字查找特定进程 提取 PID 然后使用找到的 PID 杀死它 我在 Solaris 中遇到的问题是 由于 ps 结果被截断 基于关键字的搜索将无法工作 因为关键字是被截断的部分 过去 80 个字符 的
  • 如何检查函数是否已从控制台调用?

    我试图跟踪从控制台调用某些函数的次数 我的计划是在每个函数中添加一个简单的函数 例如 trackFunction 可以检查它们是从控制台调用还是作为底层函数调用 尽管这个问题听起来很简单 但由于我在函数编程方面的知识有限 我找不到解决这个问
  • git filter repo - 未找到 Python - 但已安装

    所以我第一次尝试使用 git filter repo 我已经安装了Python 3 9 我尝试运行 git filter repo strip blobs bigger than 100M 每次失败时 git 重击 git filter r
  • psexec 支持输入重定向吗?

    我试图通过 psexec 控制远程 Python 脚本 它从 stdin 读取命令 但我需要重定向 psexec 的输入 因为 psexec 本身将从另一个程序启动 但是 我没有运气让 psexec 接受重定向的输入 它应该起作用吗 我想做
  • lxml:将命名空间添加到输入文件

    我正在解析由外部生成的 xml 文件program http celldesigner org 然后 我想使用我自己的命名空间向该文件添加自定义注释 我的输入如下所示