редактирование xml с помощью xquery или чего-то еще

Я хотел бы изменить атрибут определенных элементов в документе xml. Какой самый простой способ? (Xquery - лучший, или я как-то могу справиться с python)

Замените /root/person[1]/@name на "Jim"
замените /root/person[2]/@name на "John"

Sample.xml

<root>
    <person name="brian">
    <number>1</number>
    <school>Y</school>
    <age>18</age>
    </person>
    <person name="brian">
    <number>1</number>
    <school>Y</school>
    <age>18</age>
    </person>
</root>

Sample_result.xml

<root>
    <person name="Jim">
    <number>1</number>
    <school>Y</school>
    <age>18</age>
    </person>
    <person name="John">
    <number>1</number>
    <school>Y</school>
    <age>18</age>
    </person>
</root>

person user1610952    schedule 28.08.2012    source источник


Ответы (3)


Вносить небольшие изменения в XML-документы проще всего в XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- By default, copy elements and attributes unchanged -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>

  <!-- Change /root/person[1]/@name to "Jim" -->
  <xsl:template match="/root/person[1]/@name">
    <xsl:attribute name="name">Jim</xsl:attribute>
  </xsl:template>

  <!-- Change /root/person[2]/@name to "John" -->
  <xsl:template match="/root/person[2]/@name">
    <xsl:attribute name="name">John</xsl:attribute>
  </xsl:template>

</xsl:stylesheet>
person Michael Kay    schedule 28.08.2012

Попробуйте Обновление XQuery, если ваша реализация поддерживает это.

replace value of node /root/person[1]/@name with "Jim",
replace value of node /root/person[2]/@name with "John"
person Jens Erat    schedule 28.08.2012
comment
Спасибо! И затем XQuery Update изменяет целевой XML-файл напрямую? Я применил приведенный выше синтаксис в Stylus Studio, но, похоже, это ничего не меняет. - person user1610952; 28.08.2012
comment
Спецификация XQuery Update определяет синтаксис обновления, но оставляет открытым вопрос о том, как сохраняются изменения, например, в файловой системе. Я думаю, что некоторые реализации (например, MXQuery) требуют установки флага в командной строке, чтобы разрешить переопределение файла XML (во избежание случайных изменений). - person Ghislain Fourny; 28.08.2012

хм, может быть, просто реконструировать его и внести изменения в ЦВЕТОК? -->

element root {
    for $person at $i in doc('Sample.xml')/root/person
    let $new-name := if($i eq 1) then "Jim" else "John"
    return 
        element person {
            attribute name { $new-name },
            $person/*
        }
}
person David Lam    schedule 28.08.2012