اقرأ XML مع عناصر متعددة من المستوى الأعلى باستخدام Python ElementTree؟

StackOverflow https://stackoverflow.com/questions/2113819

سؤال

كيف يمكنني قراءة ملف XML باستخدام Python ElementTree ، إذا كان لدى XML عناصر متعددة المستوى؟

لدي ملف XML أود قراءته باستخدام Python ElementTree.

لسوء الحظ ، لديها علامات متعددة من المستوى الأعلى. سألف <doc>...</doc> حول XML ، إلا أنني يجب أن أضع <doc> بعد ال <?xml> و <!DOCTYPE> مجالات. لكن معرفة أين <!DOCTYPE> النهايات غير تافهة.

ماذا املك:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE FOO BAR "foo.dtd" [
<!ENTITY ...>
<!ENTITY ...>
<!ENTITY ...>
]>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>

ماذا اريد:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE FOO BAR "foo.dtd" [
<!ENTITY ...>
<!ENTITY ...>
<!ENTITY ...>
]>
<DOC>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
<ARTICLE> ... </ARTICLE>
</DOC>

nb قد يتغير اسم مقالة العلامة ، لذلك لا يمكنني grep لذلك.

هل يمكن لأي شخص أن يقترح لي كيف يمكنني إضافة المرفق <doc>...</doc> بعد رأس XML ، أو اقترح حلًا آخر؟

هل كانت مفيدة؟

المحلول

كتبت الوظيفة التالية لإضافة علامة toplevel بعد تعليمات معالجة XML. يمكنك الآن العثور على هذا الرمز في بلدي مكتبة بيثون المشتركة مثل common.myElementTree.add_toplevel_tag

import re
xmlprocre = re.compile("(\s*<[\?\!])")
def add_toplevel_tag(string):
    """
After all the XML processing instructions, add an enclosing top-level <DOC> tag, and return it.
e.g.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE FOO BAR "foo.dtd" [ <!ENTITY ...> <!ENTITY ...> <!ENTITY ...> ]> <ARTICLE> ...
</ARTICLE> <ARTICLE> ... </ARTICLE> <ARTICLE> ... </ARTICLE> <ARTICLE> ... </ARTICLE>
=>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE FOO BAR "foo.dtd" [ <!ENTITY ...> <!ENTITY ...> <!ENTITY ...> ]><DOC> <ARTICLE> ...
</ARTICLE> <ARTICLE> ... </ARTICLE> <ARTICLE> ... </ARTICLE> <ARTICLE> ... </ARTICLE></DOC>
"""
    def _advance_proc(string, idx):
        # If possible, advance over whitespace and one processing
        # instruction starting at string index idx, and return its index.
        # If not possible, return None
        # Find the beginning of the processing instruction
        m = xmlprocre.match(string[idx:])
        if m is None: return None
        #print "Group", m.group(1)
        idx = idx + len(m.group(1))
        #print "Remain", string[idx:]

        # Find closing > bracket
        bracketdebt = 1
        while bracketdebt > 0:
            if string[idx] == "<": bracketdebt += 1
            elif string[idx] == ">": bracketdebt -= 1
            idx += 1
        #print "Remain", string[idx:]
        return idx
    loc = 0
    while 1:
        # Advance one processing instruction
        newloc = _advance_proc(string, loc)
        if newloc is None: break
        else: loc = newloc
    return string[:loc] + "<DOC>" + string[loc:] + "</DOC>"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top