用PHP删除开始标记和结束标记之间的所有内容的最佳方法?

用PHP删除开始标记和结束标记之间的所有内容的最佳方法?,php,xml,Php,Xml,用php在XML文件中删除开始标记和结束标记之间的所有内容的最佳方法是什么 我有一个这样的XML文件 <CATALOG id="1"> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY>

用php在XML文件中删除开始标记和结束标记之间的所有内容的最佳方法是什么

我有一个这样的XML文件

    <CATALOG id="1">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG>
    <CATALOG id="2">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG>
    <CATALOG id="3">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG>

皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
例如,我想删除第一个


有什么建议吗?

您可以使用该类使用以下解决方案:

//xml内容。
$xml='0
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
';
//将XML字符串作为DOM文档加载。
$domDoc=新的DOMDocument();
$domDoc->loadXML($xml);
//创建XPath对象以浏览XML内容。
$xpath=新的DOMXPath($domDoc);
//查找属性为“id”且值为“1”的所有元素“CATALOG”
//并遍历找到的元素。
foreach($xpath->query(“//CATALOG[@id=1]”)作为$domNode){
$domNode->nodeValue='';
}
$xml=$domDoc->saveXML();
注意:您的XML字符串格式不正确。缺少XML的根元素。为了提供有效的解决方案,我添加了
根元素


可以使用DOMDocument和DOMXPath来完成。例如:

$dom = new DOMDocument();
$dom->loadXML($xml); // loads XML from a string, use $dom->load() to load from a file
$xpath = new DOMXPath($dom);
$cat = $xpath->query('//CATALOG[@id="1"]')->item(0);
while($cat->firstChild) {
    $cat->removeChild($cat->firstChild);    
}
像这样的

    <CATALOG id="1">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG>
    <CATALOG id="2">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG>
    <CATALOG id="3">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG>
//编辑

请注意,此解决方案将删除元素,如果只清除内容,则使用jazZRo提供的解决方案

$xml = '<data><CATALOG id="1">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG>
    <CATALOG id="2">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG>
    <CATALOG id="3">
       <CD>
          <TITLE>Empire Burlesque</TITLE>
          <ARTIST>Bob Dylan</ARTIST>
          <COUNTRY>USA</COUNTRY>
          <COMPANY>Columbia</COMPANY>
          <PRICE>10.90</PRICE>
          <YEAR>1985</YEAR>
       </CD>
    </CATALOG></data>';

$doc = new DOMDocument();
$doc->loadXML($xml);
$xpath = new DOMXPath($doc);
foreach($xpath->query("//CATALOG[@id=3]") as $node )
{
    $node->parentNode->removeChild($node);
}

echo $doc->saveXML();
$xml='1!'
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
';
$doc=新的DOMDocument();
$doc->loadXML($xml);
$xpath=新的DOMXPath($doc);
foreach($xpath->query(//CATALOG[@id=3]”)作为$node)
{
$node->parentNode->removeChild($node);
}
echo$doc->saveXML();

DOMNode::nodeValue是一个可写属性。我不会使用它来设置值,因为实体处理已中断,但空字符串不包含任何实体

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
foreach($xpath->evaluate("//CATALOG[@id=3]") as $node) {
  $node->nodeValue = '';
}

echo $doc->saveXML();

将XML加载到DOM中,在DOM中循环,删除具有该id或其他不需要的属性的节点,将结果保存回XML@deceze我也这么想,但在jquery中,我也出于其他目的读取了相同的XML文件,但是在那里你可以找到你要找的标记,一旦它找到标记,你就可以处理开始标记和结束标记之间的所有事情$(xml).find('CATALOG').each(函数(){if($(this).attr('ID')='1')){…但是,当我将XML加载到DOM
-ooops.或:
..
-ooops.时,我应该如何使用PHP实现这一点呢?我不能推荐此解决方案,因为您跳过了所有验证,在替换后XML仍然有效。因此,您不知道是否抛出了错误,preg_replace将毫不留情地替换。使用本机PHP函数s抛出了一个可以捕获的错误。不要使用regex for XML。这会删除目录标记,OP希望清空它,而不是删除它。我更新了我的答案,谢谢-我不认为有必要在我的答案中实现其他函数,我会像你写的jazZRo那样做。