পাইথনের সাথে মিনিডম সহ এলিমেন্ট মান পান


109

আমি পাইথনে ইভটিভ অনলাইন এপিআইয়ের জন্য একটি জিইউআই ফ্রন্টএন্ড তৈরি করছি।

আমি তাদের সার্ভার থেকে এক্সএমএল ডেটা সফলভাবে টেনে নিয়েছি।

আমি "নাম" নামক নোড থেকে মানটি ধরার চেষ্টা করছি:

from xml.dom.minidom import parse
dom = parse("C:\\eve.xml")
name = dom.getElementsByTagName('name')
print name

এটি নোডটি খুঁজে পেয়েছে বলে মনে হচ্ছে তবে আউটপুট নীচে রয়েছে:

[<DOM Element: name at 0x11e6d28>]

নোডের মান মুদ্রণের জন্য আমি এটি কীভাবে পেতে পারি?


5
এটি দেখতে বেশিরভাগ "মিনিডম" প্রশ্নের উত্তরটির মতো দেখতে শুরু হচ্ছে "এলিমেট্রি ব্যবহার করুন"।
ওয়ারেন পি

উত্তর:


156

এটা ঠিক হওয়া উচিত

name[0].firstChild.nodeValue

4
যখন আমি নাম [0] করি। নোডভ্যালু "" কিছুই নয় "ফিরিয়ে দেয়, কেবল পরীক্ষার জন্য আমি এর নামটি পাস করেছিলাম [0] .নোডনাম এবং এটি আমাকে" নাম "দিয়েছিল যা সঠিক is কোন ধারনা?
রেলসন

28
নাম [0] সম্পর্কে কি? প্রথম চিল্ড.নোডভ্যালু?
এডুফি

7
কেবল সাবধান যে আপনি এক্সএমএল-জেনারেটরে প্রয়োগের বিবরণগুলির উপর নির্ভর করছেন না। কোন গ্যারান্টী যে প্রথম সন্তান হয় টেক্সট নোড না শুধুমাত্র কোনো ক্ষেত্রেই টেক্সট নোড যেখানে একাধিক সন্তান নোড থাকতে পারে।
হেনরিক গুস্তাফসন

53
কেন কেউ এমন একটি গ্রন্থাগার ডিজাইন করবেন যেখানে <নাম> স্মিথ </ name> এর নোডভ্যালু "স্মিথ" ব্যতীত অন্য কিছু ?! এই ছোট্ট ন্যুগেটটি আমার চুল ছিঁড়ে ফেলার 30 মিনিটের জন্য ব্যয় করেছে। আমি এখন টাক পড়েছি। ধন্যবাদ, মিনিডম
আসফ লাভি

10
এটি কেবল এইচটিএমএল নিয়ে কাজ করার জন্য এটি ডিজাইন করার জন্য, কারণ << নোডএ> কিছু পাঠ্য <নোডিনথেমিডেল> __ কমপ্লেক্স__ স্ট্রাক্ট__ </ নোডনথিমিডেল> আরও কিছু পাঠ্য </ নোডএ>, এই ক্ষেত্রে আপনি কি নোডএ'র নোডভ্যালু মনে করেন? জটিল কাঠামো, বা কেবল 2 টি পাঠ্য নোড এবং মাঝারি নোড সহ সমস্ত পাঠ্য থাকা উচিত। এটি দেখার সর্বোত্তম উপায় নয়, তবে তারা কেন এটি করেছে তা আমি দেখতে পাচ্ছি।
জোশ ম্যাক

60

সম্ভবত আপনি যদি পাঠ্যের অংশটি চান তবে এটির মতো কিছু ...

from xml.dom.minidom import parse
dom = parse("C:\\eve.xml")
name = dom.getElementsByTagName('name')

print " ".join(t.nodeValue for t in name[0].childNodes if t.nodeType == t.TEXT_NODE)

নোডের পাঠ্য অংশটি নিজের কাছে নোড হিসাবে বিবেচিত যা আপনি জিজ্ঞাসা করেছেন তার চাইল্ড-নোড হিসাবে। সুতরাং আপনি এটির সমস্ত শিশুদের মধ্য দিয়ে যেতে এবং পাঠক নোডগুলি সহ সমস্ত শিশু নোডগুলি খুঁজতে চান। একটি নোডে বেশ কয়েকটি পাঠ্য নোড থাকতে পারে; যেমন।

<name>
  blabla
  <somestuff>asdf</somestuff>
  znylpx
</name>

আপনি 'ব্লেবলা' এবং 'জেনিপেক্স' উভয়ই চান; সুতরাং "" .জাইন ()। আপনি স্থানটি একটি নতুন লাইন বা তাই দিয়ে বা সম্ভবত কিছুই দ্বারা পরিবর্তন করতে চাইতে পারেন।


12

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন t এটি আমার জন্য কাজ করে

doc = parse('C:\\eve.xml')
my_node_list = doc.getElementsByTagName("name")
my_n_node = my_node_list[0]
my_child = my_n_node.firstChild
my_text = my_child.data 
print my_text

8

আমি জানি এই প্রশ্নটি এখন বেশ পুরানো, তবে আমি ভেবেছিলাম আপনার এলিমেন্টরির সাথে আরও সহজ সময় থাকতে পারে

from xml.etree import ElementTree as ET
import datetime

f = ET.XML(data)

for element in f:
    if element.tag == "currentTime":
        # Handle time data was pulled
        currentTime = datetime.datetime.strptime(element.text, "%Y-%m-%d %H:%M:%S")
    if element.tag == "cachedUntil":
        # Handle time until next allowed update
        cachedUntil = datetime.datetime.strptime(element.text, "%Y-%m-%d %H:%M:%S")
    if element.tag == "result":
        # Process list of skills
        pass

আমি জানি যে এটি সুনির্দিষ্ট নয়, তবে আমি এটি কেবল আবিষ্কার করেছি এবং এখন পর্যন্ত আমার মাথাটি মিনিডোমের চেয়ে কাছাকাছি পাওয়া অনেক সহজ (যেহেতু অনেকগুলি নোড মূলত সাদা স্থান)।

উদাহরণস্বরূপ, আপনি ট্যাগের নাম এবং প্রকৃত পাঠ্য একসাথে রেখেছিলেন, যেমনটি আপনি সম্ভবত আশা করেছিলেন:

>>> element[0]
<Element currentTime at 40984d0>
>>> element[0].tag
'currentTime'
>>> element[0].text
'2010-04-12 02:45:45'e

8

উপরের উত্তরটি সঠিক, যথা:

name[0].firstChild.nodeValue

তবে অন্যদের মতো আমার জন্যও আমার মূল্যটি গাছের নীচে ছিল:

name[0].firstChild.firstChild.nodeValue

এটি খুঁজতে আমি নিম্নলিখিতটি ব্যবহার করেছি:

def scandown( elements, indent ):
    for el in elements:
        print("   " * indent + "nodeName: " + str(el.nodeName) )
        print("   " * indent + "nodeValue: " + str(el.nodeValue) )
        print("   " * indent + "childNodes: " + str(el.childNodes) )
        scandown(el.childNodes, indent + 1)

scandown( doc.getElementsByTagName('text'), 0 )

ইনসক্যাপের সাহায্যে তৈরি করা আমার সহজ এসভিজি ফাইলের জন্য এটি চালানো আমাকে দিয়েছে:

nodeName: text
nodeValue: None
childNodes: [<DOM Element: tspan at 0x10392c6d0>]
   nodeName: tspan
   nodeValue: None
   childNodes: [<DOM Text node "'MY STRING'">]
      nodeName: #text
      nodeValue: MY STRING
      childNodes: ()
nodeName: text
nodeValue: None
childNodes: [<DOM Element: tspan at 0x10392c800>]
   nodeName: tspan
   nodeValue: None
   childNodes: [<DOM Text node "'MY WORDS'">]
      nodeName: #text
      nodeValue: MY WORDS
      childNodes: ()

আমি xml.dom.minidom ব্যবহার করেছি, এই পৃষ্ঠাতে মিনিডম পাইথন বিভিন্ন ক্ষেত্রের ব্যাখ্যা দেওয়া আছে।


2

আমার একই রকম ঘটনা ঘটেছে, যা আমার পক্ষে কাজ করেছিল তা হ'ল:

name.firstChild.childNodes [0] .data

এক্সএমএলটিকে সহজ বলে মনে করা হয়েছিল এবং এটি সত্যিই এবং আমি জানি না পাইথনের মিনিডম কেন এটি এত জটিল করেছিল ... তবে এটি কীভাবে তৈরি হয়েছিল


2

একাধিক নোডের জন্য হেনরিকের সামান্য পরিবর্তিত উত্তর এখানে রয়েছে (উদাহরণস্বরূপ, যখন এলিমেটবাইট্যাগনেম একাধিক উদাহরণ দেয়)

images = xml.getElementsByTagName("imageUrl")
for i in images:
    print " ".join(t.nodeValue for t in i.childNodes if t.nodeType == t.TEXT_NODE)

2

প্রশ্নের উত্তর দেওয়া হয়েছে, আমার অবদানটি এমন একটি বিষয় স্পষ্ট করার সাথে জড়িত যা প্রাথমিকভাবে বিভ্রান্ত করতে পারে:

কিছু প্রস্তাবিত এবং সঠিক উত্তর ব্যবহার করা হয়েছে firstChild.dataএবং অন্যরা এর firstChild.nodeValueপরিবর্তে ব্যবহার করেছেন । আপনি যদি ভাবছেন যে তাদের মধ্যে ভিন্নতা কী, তবে আপনার মনে রাখা উচিত তারা একই কাজটি করেন কারণ nodeValueএটি কেবলমাত্র একটি উপনাম data

আমার বক্তব্যের রেফারেন্সটি মিনিডোমের উত্স কোডের একটি মন্তব্য হিসাবে পাওয়া যাবে :

# এর nodeValueজন্য একটি উপনামdata


0

এটি একটি গাছ, এবং নেস্টেড উপাদান থাকতে পারে। চেষ্টা করুন:

def innerText(self, sep=''):
    t = ""
    for curNode in self.childNodes:
        if (curNode.nodeType == Node.TEXT_NODE):
            t += sep + curNode.nodeValue
        elif (curNode.nodeType == Node.ELEMENT_NODE):
            t += sep + curNode.innerText(sep=sep)
    return t
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.