最好的方式来删除一切之间的开始和结束标记与PHP


Best way to delete everything between opening and closing tag with PHP?

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

我有一个像这样的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>

例如,我想删除第一个<CATALOG id="1"></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();

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();

可以使用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);    
}

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

//the xml content.
$xml = '
    <CATALOGS>
      <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>
    </CATALOGS>';
//load the XML string as DOM document.
$domDoc = new DOMDocument();
$domDoc->loadXML($xml);
//create XPath object to navigate through the XML content.
$xpath = new DOMXPath($domDoc);
//find all elements "CATALOG" with the attribute "id" with value "1" 
//and run through the found elements.
foreach ($xpath->query("//CATALOG[@id=1]") as $domNode) {
    $domNode->nodeValue = '';
}
$xml = $domDoc->saveXML();

注意:您的XML字符串格式不正确。XML的根元素丢失了。为了提供一个可行的解决方案,我添加了<CATALOGS>根元素。