Как заменить один узел в файле XML на узел из другого файла XML? - PullRequest
1 голос
/ 21 июня 2011

У меня есть два XML-файла.Первый:

<a>
  <b>
    <c1>1</c1>
  </b>
  <b>
    <c1>2</c1>
  </b>
  <b "id" = "true">
    <c1>3</c1>
    <d "do" ="me"></d>
  </b>
  <b id ="true">
    <c1>4</c1>
  </b>
</a>

А второй:

<a>
  <b>
    <c1>5</c1>
  </b>
</a>

Я хочу обновить элемент из first.xml:

<b "id" = "true">
  <c1>3</c1>
  <d "do" ="me"></d>
</b>

с элементомfrom second.xml:

<b>
<c1>5</c1>
</b>

Я попытался добиться этого, удалив все узлы <b> из first.xml и добавив узел <b>, взятый из файла second.xml.Я могу удалить все узлы <b>, но не могу получить элемент из second.xml и добавить его в first.xml.

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

После очистки исходного XML, кажется, это то, что вы ищете:

xml1 = <<EOT
<a>
  <b>
    <c1>1</c1>
  </b>
  <b>
    <c1>2</c1>
  </b>
  <b id="true">
    <c1>3</c1>
    <d do="me"></d>
  </b>
  <b id="true">
    <c1>4</c1>
  </b>
</a>
EOT

xml2 = <<EOT
<a>
  <b>
    <c1>5</c1>
  </b>
</a>
EOT

require 'nokogiri'

doc1 = Nokogiri::XML(xml1)
doc2 = Nokogiri::XML(xml2)

doc1_b = doc1.at('//b[@id="true"]/c1/..')
doc2_b = doc2.at('b')

doc1_b.replace(doc2_b)

puts doc1.to_html

Какие выходные данные:

<a>
  <b>
    <c1>1</c1>
  </b>
  <b>
    <c1>2</c1>
  </b>
  <b>
    <c1>5</c1>
  </b>
  <b id="true">
    <c1>4</c1>
  </b>
</a>

doc1.at('//b[@id="true"]/c1/..')' означает «найти первыйвхождение тега b с id="true" с дочерним c1 узлом ".

0 голосов
/ 21 июня 2011

опция // b [@ id = "true" и d / @ do = "me"]

ответом выше на мой вопрос

...