302cc9b4780f8cbef6f70c3a8417913050b6aafb ([info]mindbound) rakstīja [info]koderi kopienā,
@ 2009-03-16 10:35:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
PyXML minidom parsing problems
Problēma ir sekojoša. Ir XML fails:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:logoport="urn:logoport:xliffeditor:xliff-extras:1.0" xmlns:idiom_temp="urn:logoport:xliffeditor:xliff-idiom-temp:1.0" xmlns:iws="http://www.idiominc.com/ws/asset">
    <file datatype="plaintext" source-language="EN" original="MultiLingualContent.fla" target-language="lv-lv">
        <header/>
        <body>
            <trans-unit resname="IDS_1" id="001">
                <source>
                    sourcesource<ph x="START_TAG" id="1" logoport:equiv-text="START_TAG">{1}</ph>sourcesource
                </source>
                <target logoport:matchpercent="0" state="translated">
                    targettarget<ph x="START_TAG" id="1" logoport:equiv-text="START_TAG">{1}</ph>targettarget
                </target>
            </trans-unit>
            <trans-unit resname="IDS_2" id="002">
                <source>
                    sourcesource<ph x="START_TAG" id="2" logoport:equiv-text="START_TAG">{2}</ph>sourcesource
                </source>
                <target logoport:matchpercent="0" state="translated">
                    targettarget<ph x="START_TAG" id="2" logoport:equiv-text="START_TAG">{2}</ph>targettarget
                </target>
            </trans-unit>
            <trans-unit resname="IDS_3" id="003">
                <source>
                    sourcesource<ph x="START_TAG" id="3" logoport:equiv-text="START_TAG">{3}</ph>sourcesource
                </source>
                <target logoport:matchpercent="0" state="translated">
                    targettarget<ph x="START_TAG" id="3" logoport:equiv-text="START_TAG">{3}</ph>targettarget
                </target>
            </trans-unit>
            <trans-unit resname="IDS_4" id="004">
                <source>
                    sourcesource<ph x="START_TAG" id="4" logoport:equiv-text="START_TAG">{4}</ph>sourcesource
                </source>
                <target logoport:matchpercent="0" state="translated">
                    targettarget<ph x="START_TAG" id="4" logoport:equiv-text="START_TAG">{4}</ph>targettarget
                </target>
            </trans-unit>
        </body>
    </file>
</xliff>


Ir Python skripts, ar kura palīdzību katras <target>...</target> virknes beigās pievienot newline, goes like this:
#!/usr/bin/env python

import sys
import getopt
from xml.dom import minidom

def usage():
    print >> sys.stderr, 'Usage: parse.py --file file_name'
   
def ferror():
    print >> sys.stderr, 'Cannot open file'
    sys.exit(2)

def main(argv):
    if len(argv) != 1:
        usage()
        sys.exit(2)
   
    try:
        opts, args = getopt.getopt(argv, "hf:", ["help", "file="])
    except getopt.GetoptError, err:
        print str(err)
        usage()
        sys.exit(2)
      
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            usage()
            sys.exit()
        elif opt in ("-f", "--file"):
            fileName = arg
        else:
            assert False, "unhandled option"
   
    try:
        dom = minidom.parse(fileName)
        file = open(fileName, 'w')
    except:
        ferror()

    rc = ''

    for node in dom.getElementsByTagName('target'):
        if node.firstChild.nodeType == minidom.Node.TEXT_NODE:
            rc = node.firstChild.data + '\n'
            node.firstChild.data = rc
         
    file.write(dom.toxml('utf-8'))
    file.close()

if __name__ == "__main__":
    main(sys.argv[1:])

Problēma sastāv no apstākļa, ka tāda vai citāda iemesla dēļ XML parseris apstājas pie <ph>...</ph> taga un ievieto newline tur, ignorējot atlikušo virknes daļu.


(Ierakstīt jaunu komentāru)


[info]watt
2009-03-16 11:34 (saite)
lj-cut, please

(Atbildēt uz šo)


[info]watt
2009-03-16 12:20 (saite)
hehe paldies, izrādās tas {pre} xml arī friendlisti platu taisīja...
anyway, varbūt firstChild strādā citādi nekā tu iedomājies.

(Atbildēt uz šo)


[info]bubu
2009-03-16 13:09 (saite)
Protams, ka apstājas.
elementam tev tur ir trīs chaildi: TEXT_NODE, tags, TEXT_NODE.
Savā kodā tu tikai pirmajam childam (t.i pirmajai TEXT_NODE'i) pieliec klāt to endlainu. Ja gribi, lai endlains ir target elementa pēdējam chaildam, tad tev jādara tā, ka apskaties pēdējā chailda tipu. Ja tas ir TEXT_NODE, tad pieliec tam galā endlainu tāpat kā tu dari tagad. Ja tas nav (tb ir parasta xml node), tad uztaisi jaunu TEXT_NODE nodi ar endlainu un šo nodi pieliec target elementam kā pēdējo chaildu.

(Atbildēt uz šo) (Diskusija)


[info]bubu
2009-03-16 13:10 (saite)
Nedaudz pazuda tagi :)
<target> elementam tev tur ir trīs čaildi: TEXT_NODE, <ph> tags, TEXT_NODE.

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]mindbound
2009-03-16 13:53 (saite)
Oh, thanks. Dīvaini vien, ka pats neieraudzīju/nepiefiksēju to, ka tur ir nevis viens, bet gan trīs elementi.

(Atbildēt uz šo) (Iepriekšējais)


[info]misame
2009-03-16 13:12 (saite)
Viss tak ir pareizi. Iterējam cauri "TARGET" elementiem. Tālāk pārbaude, ja target pirmais elements ir TEXT_NODE (un tas arī tā ir, jo pašai pirmajai TARGERT instancei firstChild ir textnode, kuras teksts ir "targettarget"...
pēc tanm tiek paņemts šī firstChild teksts (tātad "targettarget"), tam piekabināts galā "\n" un tālāk aizpildīts atpakaļ textnodes vietā.

(Atbildēt uz šo)


Neesi iežurnalējies. Iežurnalēties?