代码之家  ›  专栏  ›  技术社区  ›  flxkid

Python 2.6.2中的ElementTree处理指令支持吗?

  •  6
  • flxkid  · 技术社区  · 17 年前

    5 回复  |  直到 17 年前
        1
  •  6
  •   Oliver    14 年前

    lxml 库:它遵循ElementTree api,并添加了许多额外功能。从 compatibility overview :

    ElementTree在解析XML时忽略注释和处理指令,而etree将读取它们并将其分别视为Comment或ProcessingInstruction元素。这在文本内容中发现评论的地方尤其明显,然后由Comment元素分割。

    您可以通过传递布尔值来禁用此行为 remove_comments 和 remove_pis 您使用的解析器的关键字参数。为了方便和支持可移植代码,您还可以使用 etree.ETCompatXMLParser 而不是默认值 etree.XMLParser

    我知道不是在stdlib中,但根据我的经验,当你需要标准ElementTree无法提供的东西时,这是最好的选择。

        2
  •  6
  •   Community Mohan Dere    6 年前

    如果您需要顶级处理指令,请按如下方式创建:

    from lxml import etree
    
    root = etree.Element("anytagname")
    root.addprevious(etree.ProcessingInstruction("anypi", "anypicontent"))
    

    生成的文档将如下所示:

    <?anypi anypicontent?>
    <anytagname />
    

    他们当然应该将此添加到他们的常见问题解答中,因为IMO是另一个功能,它将这个优秀的API区分开来。

        3
  •  2
  •   bobince    17 年前

    没有明显的方法来表示根元素之外的内容(注释、PI、doctype和XML声明),这些内容在解析时也会被丢弃。(旁白:这似乎包括DTD内部子集中指定的任何默认属性,这使得ElementTree严格来说是一个不兼容的XML处理器。)

    write() _write _root

    如果你需要支持完整的XML信息集,最好还是使用DOM。

        4
  •  1
  •   steveha    17 年前

    我对ElementTree了解不多。但是,您可能能够使用我编写的名为“xe”的库来解决您的问题。

    xe是一组Python类,旨在使创建结构化XML变得容易。由于各种原因,我已经很久没有做这件事了,但如果你对此有疑问,或者需要修复错误,我愿意帮助你。

    它对处理指令等功能提供了基本的支持,只需稍加努力,我认为它就可以满足你的需求。(当我开始添加处理指令时,我并不真正理解它们,也不需要它们,所以代码有点半生不熟。)

    看看它是否有用。

    http://home.avvanta.com/~steveha/xe.html

    import xe
    doc = xe.XMLDoc()
    
    prefs = xe.NestElement("prefs")
    prefs.user_name = xe.TextElement("user_name")
    prefs.paper = xe.NestElement("paper")
    prefs.paper.width = xe.IntElement("width")
    prefs.paper.height = xe.IntElement("height")
    
    doc.root_element = prefs
    
    
    prefs.user_name = "John Doe"
    prefs.paper.width = 8
    prefs.paper.height = 10
    
    c = xe.Comment("this is a comment")
    doc.top.append(c)
    

    如果你运行了上述代码,然后运行 print doc

    <?xml version="1.0" encoding="utf-8"?>
    <!-- this is a comment -->
    <prefs>
        <user_name>John Doe</user_name>
        <paper>
            <width>8</width>
            <height>10</height>
        </paper>
    </prefs>
    

    祝你的项目顺利。

        5
  •  0
  •   Deepanjan    10 年前
    f = open('D:\Python\XML\test.xml', 'r+')
    old = f.read()
    f.seek(44,0)      #place cursor after xml declaration
    f.write('<?xml-stylesheet type="text/xsl" href="C:\Stylesheets\expand.xsl"?>'+ old[44:])
    

    我也遇到了同样的问题,在使用了Element方法之一时,也未能将PI正确插入.xml文件,于是我提出了这个粗略的解决方案 root.insert (0, PI) 并尝试多种方法将插入的PI剪切并粘贴到正确的位置,但只找到要从意外位置删除的数据。