¿如何替换和插入新节点?

问题描述

好吧,我在 jar 文件中执行了这个 xml 文件,我想添加一个新字段并更新另一个字段,当添加一个新字段正确但没有任何内容被展平时出现问题,并且在更新数据时,我不要停止收到我输入错误字段的错误

这里是代码 xml:

<?xml version="1.0"?>

<?xml-stylesheet type ="text/xsl" href = "ejercicio2parte1.xslt"?>
<musica>
    <cd>
        <titulo_del_album>Los magroños</titulo_del_album>
        <artista>Julian</artista>
            <cancion>
                <nombre>El cairo</nombre>
                <duracion>4.50s</duracion>
            </cancion>
        <sello_discografico>sony BGM</sello_discografico>
        <anyo_de_publicacion>1996</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>Scarecrow</titulo_del_album>
        <artista>Avantasia</artista>
            <cancion>
                <nombre>Scarecrow</nombre>
                <duracion>7.11</duracion>
            </cancion>
        <sello_discografico>sony BGM</sello_discografico>
        <anyo_de_publicacion>1999</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>Chichos</titulo_del_album>
        <artista>Jacobo</artista>
            <cancion>
                <nombre>El rapido</nombre>
                <duracion>1.50</duracion>
            </cancion>
        <sello_discografico>El oro</sello_discografico>
        <anyo_de_publicacion>1995</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>Los rocos</titulo_del_album>
        <artista>Martin</artista>
            <cancion>
                <nombre>Fulda</nombre>
                <duracion>5.00</duracion>
            </cancion>
        <sello_discografico>El oro</sello_discografico>
        <anyo_de_publicacion>2018</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>Jacobinos</titulo_del_album>
        <artista>El caucho</artista>
            <cancion>
                <nombre>french</nombre>
                <duracion>6.20</duracion>
            </cancion>
        <sello_discografico>AFM Records</sello_discografico>
        <anyo_de_publicacion>2010</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>JOJO</titulo_del_album>
        <artista>dio</artista>
            <cancion>
                <nombre>Kono dio da</nombre>
                <duracion>1.00</duracion>
            </cancion>
        <sello_discografico>JOJO Bizarre</sello_discografico>
        <anyo_de_publicacion>2000</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>Black beast</titulo_del_album>
        <artista>Beast in Blakc</artista>
            <cancion>
                <nombre>Berserker</nombre>
                <duracion>5.49</duracion>
            </cancion>
        <sello_discografico>Nuclear Blast Records</sello_discografico>
        <anyo_de_publicacion>2009</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>K/DA</titulo_del_album>
        <artista>Akali</artista>
            <cancion>
                <nombre>ALL OUT</nombre>
                <duracion>5.00</duracion>
            </cancion>
        <sello_discografico>Nuclear Blast Records</sello_discografico>
        <anyo_de_publicacion>2019</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>Plentakill</titulo_del_album>
        <artista>Mordekaiser</artista>
            <cancion>
                <nombre>Thornamill</nombre>
                <duracion>4.30</duracion>
            </cancion>
        <sello_discografico>Nuclear Blast Records</sello_discografico>
        <anyo_de_publicacion>2016</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>Moonglow</titulo_del_album>
        <artista>The thunder</artista>
            <cancion>
                <nombre>Cosmic night</nombre>
                <duracion>6.00</duracion>
            </cancion>
        <sello_discografico>Nuclear Blast Records</sello_discografico>
        <anyo_de_publicacion>2004</anyo_de_publicacion>
    </cd>
    <cd>
        <titulo_del_album>Mistery of time</titulo_del_album>
        <artista>Edguy</artista>
            <cancion>
                <nombre>Deep purple</nombre>
                <duracion>5.40</duracion>
            </cancion>
        <sello_discografico>Nuclear Blast Records</sello_discografico>
        <anyo_de_publicacion>2019</anyo_de_publicacion>
    </cd>
</musica>

她是我插入的代码

insert node
<cd>
        <titulo_del_album>dsadsaw</titulo_del_album>
        <artista>asddsasa</artista>
            <cancion>
                <nombre>asdsada</nombre>
                <duracion>7.11</duracion>
            </cancion>
        <sello_discografico>sony BGM</sello_discografico>
        <anyo_de_publicacion>1999</anyo_de_publicacion>
    </cd>


before doc("Ejercicio2.xml") //musica

还有我的更新代码

replace value of node
//cd/artista=("Julian")/cancion/nombre
with "Gloria Fuertes"

解决方法

insert 表达式中,您告诉 XQuery 引擎在 <cd> 之前插入 //musica 节点。但是,<musica> 是文档的根节点,因此在它之前插入一个节点会导致 XML 文件格式不正确。我希望引擎抛出错误。

如果您的目标是将 <cd> 元素插入到 <musica> 元素中,您可以使用以下表达式:

insert node <cd/> into doc("Ejercicio2.xml")/musica

要控制元素是作为第一个元素插入还是作为最后一个元素插入,请在 as first 关键字前添加 as lastinto

对于 replace 表达式,您在尝试选择 <artista> 元素时出现语法错误,而 <nombre> 元素的路径错误。

要选择 Julian <artista> 元素,请使用过滤器表达式:

//cd/artista[. = "Julian"]

扩展它以查找 <nombre> 元素:

//cd[artista = "Julian"]/cancion/nombre

请注意,尽管您的示例 XML 文件缩进了,但 <cancion> 不是 <artista> 的子元素 - 而是它的兄弟元素。