كيفية إدراج / نقل / حذف العقد في أكس مع رائع؟

StackOverflow https://stackoverflow.com/questions/224926

  •  03-07-2019
  •  | 
  •  

سؤال

وعلى سبيل المثال، لدي مستند XML التالية:

def CAR_RECORDS = '''
    <records>
      <car name='HSV Maloo' make='Holden' year='2006'/>
      <car name='P50' make='Peel' year='1962'/>
      <car name='Royale' make='Bugatti' year='1931'/>
    </records>
'''

ووأريد لتحريك السيارة "رويال" إلى الأول، وادخال سيارة جديدة بعد سيارة "HSV Maloo"، والنتيجة ستكون كما يلي:

'''
    <records>
      <car name='Royale' make='Bugatti' year='1931'/>
      <car name='HSV Maloo' make='Holden' year='2006'/>
      <car name='My New Car' make='Peel' year='1962'/>
      <car name='P50' make='Peel' year='1962'/>
    </records>
'''

وكيف نفعل ذلك مع رائع؟ التعليقات هي موضع ترحيب.

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

المحلول

ونزلت مسارا مماثلا لdanb، لكنها واجهت مشاكل عند الطباعة فعليا عمليات XML الناتجة عن ذلك. ثم أدركت أن NodeList التي تم إرجاعها عن طريق طرح الجذرية لجميع من انها "سيارة" الأطفال ليست نفس القائمة كما تحصل من قبل يسأل فقط للأطفال والجذر. على الرغم من أنها يحدث ليكون نفس القوائم في هذه الحالة، فإنها لن تكون دائما إذا كان هناك غير "سيارة" الأطفال تحت الجذر. وبسبب هذا، reording قائمة السيارات التي تعود من الاستعلام لا يؤثر على القائمة الأولية.

وهنا الحل الذي يلحق وبإعادة ترتيب:

def CAR_RECORDS = '''
   <records>
     <car name='HSV Maloo' make='Holden' year='2006'/>
     <car name='P50' make='Peel' year='1962'/>
     <car name='Royale' make='Bugatti' year='1931'/>
   </records>
 '''

def carRecords = new XmlParser().parseText(CAR_RECORDS)

def cars = carRecords.children()
def royale = cars.find { it.@name == 'Royale' } 
cars.remove(royale)
cars.add(0, royale)
def newCar = new Node(carRecords, 'car', [name:'My New Car', make:'Peel', year:'1962'])

assert ["Royale", "HSV Maloo", "P50", "My New Car"] == carRecords.car*.@name

new XmlNodePrinter().print(carRecords)

والتأكيد مع السيارات أمر propertly يمر، ومخرجات XmlNodePrinter:

<records>
  <car year="1931" make="Bugatti" name="Royale"/>
  <car year="2006" make="Holden" name="HSV Maloo"/>
  <car year="1962" make="Peel" name="P50"/>
  <car name="My New Car" make="Peel" year="1962"/>
</records>

نصائح أخرى

وتيد، وربما كنت لم يلاحظوا أن أردت أن '' 'إدراج سيارة جديدة بعد سيارة "HSV Maloo"' ''، ولذا فإنني تعديل التعليمات البرمجية ل:

def newCar = new Node(null, 'car', [name:'My New Car', make:'Peel', year:'1962'])
cars.add(2, newCar)

new XmlNodePrinter().print(carRecords)

والآن، وأنها تعمل مع النظام السليم! بفضل danb وتيد.

<records>
  <car year="1931" make="Bugatti" name="Royale"/>
  <car year="2006" make="Holden" name="HSV Maloo"/>
  <car name="My New Car" make="Peel" year="1962"/>
  <car year="1962" make="Peel" name="P50"/>
</records>

<اليد موجة> هذه ليست codz كنت تسعى

Node root = new XmlParser().parseText(CAR_RECORDS)
NodeList carNodes = root.car
Node royale = carNodes[2]
carNodes.remove(royale)
carNodes.add(0, royale)
carNodes.add(2, new Node(root, 'car', [name:'My New Card', make:'Peel', year:'1962']))

وأنا لا أعرف إذا كان هناك طريقة أكثر ذكاء لخلق عقد جديدة ... ولكن أن يعمل بالنسبة لي.

وتحرير: uhg ... شكرا لكم أيها الرجال ... حصلت كسول والطباعة carNodes عندما اختبرت هذا بدلا من الجذر ... ييكيس.

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