在PHP中使用DOM编辑子节点XML

在PHP中使用DOM编辑子节点XML,php,xml,parsing,dom,xml-parsing,Php,Xml,Parsing,Dom,Xml Parsing,我正试图实现从PHP驱动的web应用程序编辑基于XML的新闻提要的功能。然而,它似乎从来没有保存 我使用的XML文件如下所示: <?xml version="1.0" standalone="yes"?> <issues> <issue> <issue_id>1</is

我正试图实现从PHP驱动的web应用程序编辑基于XML的新闻提要的功能。然而,它似乎从来没有保存

我使用的XML文件如下所示:

<?xml version="1.0" standalone="yes"?>
<issues>                                                                    
        <issue>
            <issue_id>1</issue_id>
            <issue_name>Don't double my rates!</issue_name>
            <issue_body>Congress is on the verge of letting student rates double a week from today. Swing by the UC Lawn at 5:00 this Thursday to reach out to our Representatives and tell them: #DontDoubleMyRates!</issue_body></issue>
         <issue>
            <issue_id>2</issue_id>
            <issue_name>Proposed Senate Budget</issue_name>
            <issue_body>College Democrats are baffled by the proposed senate budget. This is our state, we must make our opinions heard! #NCGOPBudget #StopCuts</issue_body></issue>
         <issue>
            <issue_id>3</issue_id>
            <issue_name>Voter Suppression Law Invalidated!</issue_name>
            <issue_body>Join us in applauding the US Supreme Court for invalidating Arizona's voter-suppression law requiring that voters present proof of citizenship before voting!</issue_body></issue>
         <issue>
            <issue_id>4</issue_id>
            <issue_name>Here's an actual article I found interesting</issue_name>                    
            <issue_body>Actually, not really beacause I really didn't want to google for some arbitrary article to help test this out so here's a bunch of filler text to hopefully emulate at least the by-line of an article pertaining to the democratic party organization here on campus.</issue_body>
            </issue>
</issues>

1.
别把我的价格加倍!
国会即将允许学生从今天起每周增加一倍。本周四5:00在加州大学草坪上闲逛,联系我们的代表,并告诉他们:#不要犹豫!
2.
参议院拟议预算
大学民主党人对拟议的参议院预算感到困惑。这是我们的国家,我们必须让大家听到我们的意见#NCGOPBudget#停止切割
3.
禁止选民投票法无效!
请加入我们,为美国最高法院宣布亚利桑那州禁止选民投票法无效鼓掌,该法要求选民在投票前出示公民身份证明!
4.
这是一篇我觉得有趣的文章
事实上,并不是因为我真的不想用谷歌搜索一些武断的文章来帮助测试这一点,所以这里有一堆填充文本,希望至少能模仿一篇关于校园民主党组织的文章。
以下是尝试编辑预先存在的节点的相关php脚本:

<?php                                                                           
$newName = $_POST['name'];                                                  
$newBody = $_POST['body'];                                                  
$issue_id = $_POST['edit'];                                                 

$dom = new DOMDocument;                                                     
$dom->preserveWhiteSpace = FALSE;                                           
$dom->load('issues.xml');                                                   

$xpath = new DOMXPath($dom);                                                
$query = '/issues/issue';                                          

foreach($xpath->query($query) as $issue) {                                  
    $id = $issue->parentNode->getElementsByTagName("issue_id");         
    if($id->item($issue_id)->nodeValue = $issue_id) {                   
    $name = $issue->parentNode->getElementsByTagName("issue_name");       
    $body = $issue->parentNode->getElementsByTagName("issue_body");       
    $name->item($issue_id-1)->nodeValue = '$newName';                           
    $body->item($issue_id-1)->nodeValue = '$newBody';                        
    break;                                                                  
    }                                                                       
}                                                                           

    $dom->save("issues.xml");                                                   
?>
query($query)作为$issue){
$id=$issue->parentNode->getElementsByTagName(“issue_id”);
如果($id->item($issue\u id)->nodeValue=$issue\u id){
$name=$issue->parentNode->getElementsByTagName(“issue_name”);
$body=$issue->parentNode->getElementsByTagName(“issue_body”);
$name->item($issue_id-1)->nodeValue='$newName';
$body->item($issue_id-1)->nodeValue='$newBody';
打破
}                                                                       
}                                                                           
$dom->save(“issues.xml”);
?>
这是一个引用页面,它遍历子节点,直到找到以前选择的节点ID,然后在表中显示其信息

<?php                                                                           
$issue_id = $_POST['edit'];                                                 
$issueArray = array(                                                        
'id' =>$_POST['id'],                                                        
'issue_name' => $_POST['issue_name'],                                       
'issue_body' => $_POST['issue_body'],                                       
);                                                                          

$dom = new DOMDocument;                                                     
$dom->preserveWhiteSpace = FALSE;                                           
$dom->load('issues.xml');                                                   

$xpath = new DOMXPath($dom);                                                
$query = '/issues/issue';                                          

$i = 0;                                                                     
echo "<body><form action='saveChanges.php' method='post'><table border='1'><tr><th>ID</th><th>Name</th><th>Body</th></tr>";

foreach($xpath->query($query) as $issue) {                                  
    $eventI = $issue->parentNode->getElementsByTagName("issue_id");         
    if($eventI->item($issue_id)->nodeValue = $issue_id) {                   
    $eventN = $issue->parentNode->getElementsByTagName("issue_name");       
    $eventP = $issue->parentNode->getElementsByTagName("issue_body");       
    print "<tr><td>'".$eventI->item($issue_id-1)->nodeValue."'></td><td>'".$eventN->item($issue_id-1)->nodeValue."'></td><td>'".$eventP->item($issue_id-1)->nodeValue."'</td></tr>";
    print "<tr><td></td><th>New Name</td><th>New Body</td></tr>";           
    print "<tr><td></td><td><input type='text' name='name'size='50'</input></td><td><input type='text' name='body' size='200'</input></td></tr>";
    print "<tr><td><input type='hidden' name='id' value='$issue_id'/></td><th><input type='submit' action='saveChanges.php' name='edit' method='post' value='Confirm Edit'/></th><th></th>";
    break;                                                                  
    }                                                                       
}                                                                           
print "</table></body>";                                                    
?>
query($query)作为$issue){
$eventI=$issue->parentNode->getElementsByTagName(“问题id”);
如果($eventI->item($issue\u id)->nodeValue=$issue\u id){
$eventN=$issue->parentNode->getElementsByTagName(“问题名称”);
$eventP=$issue->parentNode->getElementsByTagName(“问题正文”);
打印“'.”“$eventI->item($issue_id-1)->nodeValue.”“>”“$eventN->item($issue_id-1)->nodeValue.”“>”“$eventP->item($issue_id-1)->nodeValue.”;
打印“新名称新正文”;

print“操作DOM的代码中存在各种各样的问题。只需查看for循环的内容,就可以从以下内容开始:

$id = $issue->parentNode->getElementsByTagName("issue_id");      
在上面的一行中,您获取了在for循环中枚举的
$issue
,然后引用了它的父项,这对于每个问题都是相同的,因此使枚举不相关

然后,您将获得该树中的所有
issue\u id
元素,您可以使用这些元素:

if($id->item($issue_id)->nodeValue = $issue_id) {                   
这里您使用
$issue\u id
作为索引,它假设
issue\u id
为3(例如)将始终是第三个问题,这可能不是真的

另外,单个
=
是一个赋值,而不是一个比较,我相信这不是您的意图

$name
$body
查找是相同的:

$name = $issue->parentNode->getElementsByTagName("issue_name");       
$body = $issue->parentNode->getElementsByTagName("issue_body");       
同样,您将忽略已枚举并从父节点开始工作的
$issue
,然后只获取与
issue\u name
issue\u body
匹配的所有子元素

您再次使用
$issue\u id
作为索引:

$name->item($issue_id-1)->nodeValue = '$newName';                           
$body->item($issue_id-1)->nodeValue = '$newBody';                        
不过,这一次您使用的是
$issue\u id-1
-这有什么原因吗

此外,当您在php中对字符串使用单引号时,这不会扩展变量,因此名称将始终设置为文本字符串
$newName
,而不是该变量的值。您应该使用双引号,或者最好直接赋值

这更像我所期望的代码:

foreach($xpath->query($query) as $issue) {        
    $id = $issue->getElementsByTagName("issue_id")->item(0);  
    if($id->nodeValue == $issue_id) {  
        $name = $issue->getElementsByTagName("issue_name")->item(0);       
        $body = $issue->getElementsByTagName("issue_body")->item(0);       
        $name->nodeValue = $newName;
        $body->nodeValue = $newBody;
        break;                                                                  
    }                                                                       
}

您的代码的其余部分有更多相同的问题,但希望这将为您指明正确的方向。

此网站是为专业程序员和热心程序员提供的。您可能想尝试其他论坛。正如您所要求的那样“进入正确的方向”"嗯,我是一名计算机科学专业的学生,第一次接受XML操作的任务,所以我对这门学科完全陌生。经过几个小时的搜索和研究,我想我应该寻求一些帮助,因为,你知道,这就是这个网站的用途。我想这是值得一试的。我不知道我会遇到一些使用u尽管如此,他们的屁股。@ChrisDevWard我个人认为你的问题没有什么特别的问题,如果我的回答被认为是精英主义者,我道歉。我是想帮助你。@JamesHolderness不用担心,你的评论帮了大忙。这更指向哈克尔的屈尊的显著感谢你的回答。这是我的f第一个主要的PHP项目,所以我似乎犯了很多简单的错误,特别是在连续几个小时盯着我的整个代码库之后(编辑XML元素是我在结束项目之前的最后一项任务)。感谢您的反馈,帮助很大!@ChrisDevWard:如果您对代码审查感兴趣,这在程序员网站上是可以接受的:。请将问题放在最上面