Как вставить/переместить/удалить узлы в xml с Groovy?

У вас уже есть блок if, чтобы проверить, является ли он действительным пользователем, почему бы не использовать его, чтобы проверить, установлено ли first_name?

Что касается добавления объекта в начале массива, вы могли бы используйте для этого оператор расширения. ([newElement, ...array])

class UserList {
  constructor(users) {
    this.users = users;
  }
  add(newUser) {
    if (typeof newUser === 'object' && newUser.first_name) {
      users = [{id: users.length, ...newUser}, ...users];
      console.log(`Hello everyone i am ${newUser.first_name}`);
    } else {
      console.log('Please add object where first_name field is required!');
    }
  }
}

РЕДАКТИРОВАТЬ:

Поскольку Линшлагер быстро указал, вы можете даже сделать его однострочным, создав новый объект из id: users.length и расширения объекта newUser.

13
задан Opal 13 March 2018 в 08:24
поделиться

3 ответа

Я спустился по подобному маршруту к 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)

Утверждение с продерзко заказанными автомобильными передачами и выводы 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>
13
ответ дан 1 December 2019 в 22:41
поделиться

Тед, возможно, Вы не заметили, что я хотел к, '''вставляют новый автомобиль сразу после автомобиля "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>
6
ответ дан 1 December 2019 в 22:41
поделиться

<ручная волна> это не codz, который Вы ищете </hand-wave>

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, когда я протестировал это вместо корня... черт.

2
ответ дан 1 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: