在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>
根元素。