मैं इस एक्सएमएल की सभी आईडी नहीं प्राप्त करना चाहता (एक्सएमएल बदला नहीं जा सकता)

<?xml version="1.0" encoding="ISO-8859-1"?>
<List>
 <Person1>
    <Id>E00023</Id>
    <empName>Aadharsh</empName> 
 </Person1>
 <Person2>
    <Id>E00042</Id>
    <empName>Raksha</empName> 
 </Person2>
</List>

मैंने कोड का पालन करने की कोशिश की, लेकिन मैं काम नहीं करता :( समस्या यह है कि व्यक्ति 1 और व्यक्ति 2 अलग-अलग नाम हैं। सभी आईडी प्राप्त करने के लिए मुझे क्या बदलना होगा?

$XMLfile = 'C:\test.xml'
[XML]$empDetails = Get-Content $XMLfile
 
foreach($module in $empDetails.List.$module){
Write-Host "Id :" $module.Id
}

इस कोड के साथ मुझे केवल व्यक्ति 1 की आईडी मिलती है:

$XMLfile = 'C:\test.xml'
[XML]$empDetails = Get-Content $XMLfile
     
foreach($module in $empDetails.List.Person1){
Write-Host "Id :" $module.Id
}
0
Thomas Pichler 12 सितंबर 2020, 11:11

1 उत्तर

सबसे बढ़िया उत्तर

मुझे क्या बदलना है?

सबसे पहले और सबसे महत्वपूर्ण: आपको अपने एक्सएमएल में <Person1> और <Person2> को <Person> में बदलना होगा। काउंटर प्रत्यय के साथ तत्व नामों का उपयोग न करें, क्योंकि यह एक्सएमएल को अनावश्यक रूप से कठिन बनाता है (और क्योंकि यह पूरी तरह से व्यर्थ बात है - यदि एक्सएमएल में वर्णित दो व्यक्ति हैं, तो उन दोनों को होना चाहिए <Person>)।

ऐसा करने से XML तक पहुँचना आसान और तार्किक हो जाता है:

foreach ($person in $empDetails.List.Person) {
    Write-Host "Id :" $person.Id
}

दूसरा: आपको एक्सएमएल फाइलों को पढ़ने के तरीके को बदलने की जरूरत है। XML फ़ाइलों को पढ़ने के लिए कभी भी Get-Content का प्रयोग न करें। फ़ाइल पथ के माध्यम से हमेशा एक XML दस्तावेज़ ऑब्जेक्ट और .Load() XML बनाएं।

$empDetails = New-Object xml
$empDetails.Load('C:\test.xml')

यह सुनिश्चित करता है कि फ़ाइल एन्कोडिंग को सही ढंग से संभाला जाता है (यानी <?xml version="1.0" encoding="ISO-8859-1"?>)। Get-Content का उपयोग करने से ऐसा नहीं होगा, जिससे डेटा टूट सकता है।

0
Tomalak 12 सितंबर 2020, 11:25