سؤال

أحاول قراءة ملف XML في بيثون، وسحب عناصر معينة من ملف XML ثم اكتب النتائج مرة أخرى إلى ملف XML (لذلك في الأساس هو ملف XML الأصلي دون عدة عناصر). عندما أستخدم .REMOVECHILD (المصدر) يزيل العناصر الفردية التي أرغب في إزالتها ولكن أترك المساحة البيضاء في جعل الملف غير قابل للقراءة للغاية. أعلم أنه لا يزال بإمكاني تحليل الملف مع كل المسافة بيضاء، ولكن أوقاتا عندما أحتاج إلى تغيير قيم سمات عنصر معين يدويا، مما يجعل الأمر صعبا (وآنيوينج) للقيام بذلك. بالتأكيد أستطيع إزالة المسافة البيضاء باليد ولكن إذا كان لدي عشرات ملفات XML هذه ليست ممكنة حقا.

هل هناك طريقة للقيام بها .REMOVECHILD وإزالة المساحة البيضاء كذلك؟

إليك ما يشبه رمزي:

dom=parse(filename)
main=dom.childNodes[0]
sources = main.getElementsByTagName("source")
for source in sources :
    name=source.getAttribute("name")
    spatialModel=source.getElementsByTagName("spatialModel")
    val1=float(spatialModel[0].getElementsByTagName("parameter")[0].getAttribute("value"))
    val2=float(spatialModel[0].getElementsByTagName("parameter")[1].getAttribute("value"))
    if angsep(val1,val2,X,Y)>=ROI :
        main.removeChild(source)
    else:
        print name,val1,val2,angsep(val1,val2,X,Y)
f=open(outfile,"write")
f.write("<?xml version=\"1.0\" ?>\n")
f.write(dom.saveXML(main))
f.close()

شكرا جزيلا للمساعدة.

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

المحلول 2

لم أستطع معرفة كيفية القيام بذلك باستخدام XML.Dom.minidom، لذلك أنا فقط كتبت وظيفة سريعة للقراءة في ملف الإخراج وإزالة جميع الأسطر الفارغة ثم أعد كتابة ملف جديد:

f = open(xmlfile).readlines()
w = open('src_model.xml','w')
empty=re.compile('^$')
for line in open(xmlfile).readlines():
    if empty.match(line):
        continue
    else: 
        w.write(line)

هذا يعمل بشكل جيد بما فيه الكفاية بالنسبة لي :)

نصائح أخرى

إذا كان لديك PYXML مثبتا، يمكنك استخدام XML.dom.ext.prettyprint ()

... للبحث PPL:

هذا القصاص مضحك

skey = lambda x: getattr(x, "tagName", None)
mainnode.childNodes = sorted( 
  [n for n in mainnode.childNodes if n.nodeType != n.TEXT_NODE],
  cmp=lambda x, y: cmp(skey(y), skey(x)))

يزيل جميع العقد النصية (وأيضا، عكس الفرز بواسطة TagName).

أي يمكنك (متكررة) القيام به tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE] لإزالة جميع العقد النصية

أو قد ترغب في القيام بشيء مثل … if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE) (لم أحاول ذلك بنفسي) إذا كنت بحاجة إلى عقد نصية مع بعض البيانات. أو شيء أكثر تعقيدا لترك نص داخل علامات محددة.

بعد ذلك tree.toprettyxml(…) سيعود نص XML منسق جيدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top