【问题标题】:how to set xml attribute value change if xml element name is same如果xml元素名称相同,如何设置xml属性值更改
【发布时间】:2013-06-01 05:07:03
【问题描述】:

我有以下 XML 文件:

<root>
  <SignUp user_id = 'joseph' image = 'myByk.jpg' />
  <SignUp user_id = 'jack' image = 'myCar.jpg' />  
  <SignUp user_id = 'lamp' image = 'myhome.jpg' />
</root>

在此文件中,我想获取带有user_idjack”的SignUp 元素,并更改其image 属性。

我尝试了以下 PHP 代码:

<?php
  $dom = new DomDocument();
  $dom->load('data_out.xml');
  $xp = new DomXPath($dom);
  $res = $xp->query("//*[@user_id = 'jack']");
  $xp->SignUp->attributes()->image = "my School.jpg";
  $dom->save('data_out.xml');
?>

但是,它似乎不起作用......

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    由于在query 中,您将按属性进行,因此您可以有多个结果元素,因此它被包装在某种列表中(dom node list)。

    这是我的想法(未经测试):

    <?php
        $dom = new DomDocument();
        $dom->load('data_out.xml');
        $xp = new DomXPath($dom);
        $res = $xp->query("//*[@user_id = 'jack']");
        $res->item(0)->setAttribute("image", "my School.jpg");
        $dom->save('data_out.xml');
    ?>
    

    类似代码在sandbox中成功测试:

    $dom = new DomDocument();
    $dom->loadXML(
        "<root>
            <SignUp user_id = 'joseph' image = 'myByk.jpg' />
            <SignUp user_id = 'jack' image = 'myCar.jpg' />  
            <SignUp user_id = 'lamp' image = 'myhome.jpg' />
        </root>"
    );
    $xp = new DomXPath($dom);
    $res = $xp->query("//*[@user_id = 'jack']");
    $res->item(0)->setAttribute("image", "my School.jpg");
    $ret =  $dom->saveXML();
    echo $ret;
    

    返回

    <?xml version="1.0"?>
    <root>
        <SignUp user_id="joseph" image="myByk.jpg"/>
        <SignUp user_id="jack" image="my School.jpg"/>  
        <SignUp user_id="lamp" image="myhome.jpg"/>
    </root>
    

    【讨论】:

    • 第6行返回错误Call to undefined method DOMXPath::item()
    • 正确,现在应该修复,取消引用错误的变量。
    • 是的,这是工作,但我不使用 xml 作为字符串这是什么?
    • @jackxml,另请注意,您尝试在原始代码中设置的 attributes 属性是 readonlyphp.net/manual/en/class.domnode.php
    • @7stud 我认为这个想法源自SimpleXMLElement jack 试图将属性作为一种方法访问,对于 DomNode 来说它是一个成员。
    【解决方案2】:

    那么也许操作应该考虑使用 SimpleXML:

    if ($root = simplexml_load_file('xml.xml') ) 
    {
        //access attributes like an array:
        echo $root->SignUp[0]["user_id"] . "\n";  
    
        $target_elements = $root->xpath("//*[@user_id = 'jack']");
        $target_elements[0]["image"] = "mySchool.jpg";
        $root->asXML('datat_out.xml');
    
    }
    

    注意,要改变一个属性,你不必使用繁琐的:

    $target_attr = "image";
    $target_elements[0]->attributes()->$target_attr = "hello";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多