سؤال

أواجه صعوبة في العثور على مثال أساسي جيد على كيفية تحليل XML في Python باستخدام Tree Tree. من ما يمكنني العثور عليه ، يبدو أن هذا هو أسهل مكتبة لاستخدامها في تحليل XML. فيما يلي عينة من XML التي أعمل معها:

<timeSeriesResponse>
    <queryInfo>
        <locationParam>01474500</locationParam>
        <variableParam>99988</variableParam>
        <timeParam>
            <beginDateTime>2009-09-24T15:15:55.271</beginDateTime>
            <endDateTime>2009-11-23T15:15:55.271</endDateTime>
        </timeParam>
     </queryInfo>
     <timeSeries name="NWIS Time Series Instantaneous Values">
         <values count="2876">
            <value dateTime="2009-09-24T15:30:00.000-04:00" qualifiers="P">550</value>
            <value dateTime="2009-09-24T16:00:00.000-04:00" qualifiers="P">419</value>
            <value dateTime="2009-09-24T16:30:00.000-04:00" qualifiers="P">370</value>
            .....
         </values>
     </timeSeries>
</timeSeriesResponse>

أنا قادر على فعل ما أحتاجه ، باستخدام طريقة مشفرة. لكني بحاجة إلى أن يكون الكود الخاص بي أكثر ديناميكية. هذا ما نجح:

tree = ET.parse(sample.xml)
doc = tree.getroot()

timeseries =  doc[1]
values = timeseries[2]

print child.attrib['dateTime'], child.text
#prints 2009-09-24T15:30:00.000-04:00, 550

فيما يلي بعض الأشياء التي جربتها ، لم يعمل أي منهم ، وأبلغوا أنهما لم يتمكنوا

tree = ET.parse(sample.xml)
tree.find('timeSeries')

tree = ET.parse(sample.xml)
doc = tree.getroot()
doc.find('timeSeries')

في الأساس ، أريد تحميل ملف XML ، والبحث عن علامة الوقت ، والتكرار من خلال علامات القيمة ، وإرجاع DateTime وقيمة العلامة نفسها ؛ كل ما أفعله في المثال أعلاه ، ولكن ليس الترميز الصعب لأقسام XML التي أهتم بها. هل يمكن لأي شخص أن يوجهني إلى بعض الأمثلة ، أو يعطيني بعض الاقتراحات حول كيفية العمل من خلال هذا؟


شكرا لجميع التعليمات. باستخدام كل من الاقتراحات أدناه التي عملت على ملف العينة الذي قدمته ، ومع ذلك ، لم يعملوا على الملف الكامل. فيما يلي الخطأ الذي أحصل عليه من الملف الحقيقي عندما أستخدم طريقة إد كاريل:

 (<type 'exceptions.AttributeError'>, AttributeError("'NoneType' object has no attribute 'attrib'",), <traceback object at 0x011EFB70>)

اعتقدت أن هناك شيئًا ما في الملف الحقيقي الذي لم يعجبه ، لذلك قمت بإزالة الأشياء بشكل متزايد حتى يعمل. فيما يلي الخطوط التي قمت بتغييرها:

originally: <timeSeriesResponse xsi:schemaLocation="a URL I removed" xmlns="a URL I removed" xmlns:xsi="a URL I removed">
 changed to: <timeSeriesResponse>

 originally:  <sourceInfo xsi:type="SiteInfoType">
 changed to: <sourceInfo>

 originally: <geogLocation xsi:type="LatLonPointType" srs="EPSG:4326">
 changed to: <geogLocation>

إزالة السمات التي لديها "XSI: ..." إصلاح المشكلة. هل "XSI: ..." غير صالح XML؟ سيكون من الصعب علي إزالة هذه البرمجيات. أي عمل مقترح حوله؟

هنا ملف XML الكامل: http://www.sendspace.com/file/lofcpt


عندما طرحت هذا السؤال في الأصل ، لم أكن على دراية بمساحات الأسماء في XML. الآن بعد أن عرفت ما يجري ، لست مضطرًا لإزالة سمات "XSI" ، وهي إعلانات مساحة الاسم. أنا فقط أدرجهم في عمليات البحث عن XPath الخاصة بي. يرى هذه الصفحة لمزيد من المعلومات حول مساحات الأسماء في LXML.

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

المحلول

لذلك لدي ElementTree 1.2.6 على صندوقي الآن ، وقمت بتشغيل الكود التالي مقابل قطعة XML التي نشرتها:

import elementtree.ElementTree as ET

tree = ET.parse("test.xml")
doc = tree.getroot()
thingy = doc.find('timeSeries')

print thingy.attrib

وحصلت على ما يلي:

{'name': 'NWIS Time Series Instantaneous Values'}

يبدو أنه قد وجد عنصر Timeseries دون الحاجة إلى استخدام المؤشرات العددية.

ما سيكون مفيدًا الآن هو معرفة ما تعنيه عندما تقول "لا يعمل". نظرًا لأنه يعمل بالنسبة لي بالنظر إلى نفس المدخلات ، فمن غير المرجح أن يتم كسر ElementTree بطريقة واضحة. قم بتحديث سؤالك مع أي رسائل خطأ أو مسارات خلفية أو أي شيء يمكنك تقديمه لمساعدتك في مساعدتك.

نصائح أخرى

إذا فهمت سؤالك بشكل صحيح:

for elem in doc.findall('timeSeries/values/value'):
    print elem.get('dateTime'), elem.text

أو إذا كنت تفضل (وإذا كان هناك حدث واحد فقط timeSeries/values:

values = doc.find('timeSeries/values')
for value in values:
    print value.get('dateTime'), elem.text

ال findall() تُرجع الطريقة قائمة بجميع العناصر المطابقة ، في حين find() إرجاع فقط العنصر المطابق الأول. المثال الأول يحلق على جميع العناصر التي تم العثور عليها ، الحلقات الثانية على عناصر الطفل من values عنصر ، في هذه الحالة مما يؤدي إلى نفس النتيجة.

لا أرى أين المشكلة في عدم العثور عليها timeSeries ومع ذلك. ربما نسيت للتو getroot() يتصل؟ (لاحظ أنك لا تحتاجها حقًا لأنه يمكنك العمل من Elementtree نفسه أيضًا ، إذا قمت بتغيير تعبير المسار إلى على سبيل المثال /timeSeriesResponse/timeSeries/values أو //timeSeries/values)

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