用 PHP5 轻松解析 XML_PHP教程
用 sax 方式的时候,要自己构建3个函数,而且要直接用这三的函数来返回数据,要求较强的逻辑。在处理不同结构的 xml 的时候,还要重新进行构造这三个函数,麻烦!
用 dom 方式,倒是好些,但是他把每个节点都看作是一个 node,,操作起来要写好多的代码,麻烦!
网上有好多的开源的 xml 解析的类库,以前看过几个,但是心里总是觉得不踏实,感觉总是跟在别人的屁股后面。
这几天在搞 Java,挺累的,所以决定换换脑袋,写点 PHP 代码,为了防止以后 XML 解析过程再令我犯难,就花了一天的时间写了下面一个 XML 解析的类,于是就有了下面的东西。
实现方式是通过包装“sax方式的解析结果”来实现的。总的来说,对于我个人来说挺实用的,性能也还可以,基本上可以完成大多数的处理要求。
功能:
1\ 对基本的 XML 文件的节点进行 查询 / 添加 / 修改 / 删除 工作。
2\ 导出 XML 文件的所有数据到一个数组里面。
3\ 整个设计采用了 OO 方式,在操作结果集的时候,使用方法类似于 dom
缺点:
1\ 每个节点最好都带有一个id(看后面的例子),每个“节点名字”=“节点的标签_节点的id”,如果这个 id 值没有设置,程序将自动给他产生一个 id,这个 id 就是这个节点在他的上级节点中的位置编号,从 0 开始。
2\ 查询某个节点的时候可以通过用“|”符号连接“节点名字”来进行。这些“节点名字”都是按顺序写好的上级节点的名字。
使用说明:
运行下面的例子,在执行结果页面上可以看到函数的使用说明
代码是通过 PHP5 来实现的,在 PHP4 中无法正常运行。
由于刚刚写完,所以没有整理文档,下面的例子演示的只是一部分的功能,代码不是很难,要是想知道更多的功能,可以研究研究源代码。
目录结构:
test.xml
xml / SimpleDocumentBase.php
xml / SimpleDocumentNode.php
xml / SimpleDocumentRoot.php
xml / SimpleDocumentParser.php
北京长安街-9999号
文件:test.php
require_once "xml/SimpleDocumentBase.php";
require_once "xml/SimpleDocumentRoot.php";
require_once "xml/SimpleDocumentNode.php";
$test->parse("test.xml");
$dom = $test->getSimpleDocument();
";
";
echo "下面是通过函数getSaveData()返回的整个xml数据的数组";
echo "
";
print_r($dom->getSaveData());
";
echo "下面是通过setValue()函数,给给根节点添加信息,添加后显示出结果xml文件的内容";
echo "
";
$dom->setValue("telphone", "123456789");
echo htmlspecialchars($dom->getSaveXml());
";
echo "下面是通过getNode()函数,返回某一个分类下的所有商品的信息";
echo "
";
$obj = $dom->getNode("cat_food");
$nodeList = $obj->getNode();
foreach($nodeList as $node){
$data = $node->getValue();
echo "商品名:".$data[name]."
";
print_R($data);
print_R($node->getAttribute());
}
";
echo "下面是通过findNodeByPath()函数,返回某一商品的信息";
echo "
";
$obj = $dom->findNodeByPath("cat_food|goods_food11");
if(!is_object($obj)){
echo "该商品不存在";
}else{
$data = $obj->getValue();
echo "商品名:".$data[name]."
";
print_R($data);
print_R($obj->getAttribute());
}
";
echo "下面是通过setValue()函数,给商品\"food11\"添加属性, 然后显示添加后的结果";
echo "
";
$obj = $dom->findNodeByPath("cat_food|goods_food11");
$obj->setValue("leaveword", array("value"=>"这个商品不错", "attrs"=>array("author"=>"hahawen", "date"=>date('Y-m-d'))));
echo htmlspecialchars($dom->getSaveXml());
";
echo "下面是通过removeValue()/removeAttribute()函数,给商品\"food11\"改变和删除属性, 然后显示操作后的结果";
echo "
";
$obj = $dom->findNodeByPath("cat_food|goods_food12");
$obj->setValue("name", "new food12");
$obj->removeValue("desc");
echo htmlspecialchars($dom->getSaveXml());
";
echo "下面是通过createNode()函数,添加商品, 然后显示添加后的结果";
echo "
";
$obj = $dom->findNodeByPath("cat_food");
$newObj = $obj->createNode("goods", array("id"=>"food13"));
$newObj->setValue("name", "food13");
$newObj->setValue("price", 100);
echo htmlspecialchars($dom->getSaveXml());
";
echo "下面是通过removeNode()函数,删除商品, 然后显示删除后的结果";
echo "
";
$obj = $dom->findNodeByPath("cat_food");
$obj->removeNode("goods_food12");
echo htmlspecialchars($dom->getSaveXml());
?>
*================================================
*
* @author hahawen(大龄青年)
* @copyright Copyright (c) 2004, NxCoder Group
*
*================================================
*/
/**
* class SimpleDocumentParser
* use SAX parse xml file, and build SimpleDocumentObject
* all this pachage's is work for xml file, and method is action as DOM.
*
* @package SmartWeb.common.xml
* @version 1.0
*/
class SimpleDocumentParser
{
private $currentName = null;
private $currentValue = null;
private $currentAttribute = null;
function getSimpleDocument()
{
return $this->domRootObject;
}
{
$xmlParser = xml_parser_create();
xml_parser_set_option($xmlParser,XML_OPTION_CASE_FOLDING,
0);
xml_parser_set_option($xmlParser,XML_OPTION_SKIP_WHITE, 1);
xml_parser_set_option($xmlParser,
XML_OPTION_TARGET_ENCODING, 'UTF-8');
xml_set_object($xmlParser, $this);
xml_set_character_data_handler($xmlParser,
"characterData");
xml_get_current_line_number($xmlParser)));
{
$this->currentName = $name;
$this->currentAttribute = $attrs;
if($this->currentNO == null)
{
$this->domRootObject = new SimpleDocumentRoot($name);
}
else
{
$this->currentNO = $this->currentNO->createNode($name, $attrs);
}
{
if($this->currentName==$name)
$tag = $this->currentNO->getSeq();
$this->currentNO = $this->currentNO->getPNodeObject();
if($this->currentAttribute!=null && sizeof($this->currentAttribute)>0)
$this->currentNO->setValue($name, array('value'=>$this->currentValue, 'attrs'=>$this->currentAttribute));
else
$this->currentNO->setValue($name, $this->currentValue);
}
else
{
$this->currentNO = (is_a($this->currentNO, 'SimpleDocumentRoot'))? null:
$this->currentNO->getPNodeObject();
}
}
{
$this->currentValue = iconv('UTF-8', 'GB2312', $data);
}
function __destruct()
{
unset($this->domRootObject);
}
?>
*=================================================
*
* @author hahawen(大龄青年)
* @since 2004-12-04
* @copyright Copyright (c) 2004, NxCoder Group
*
*=================================================
*/
/**
* abstract class SimpleDocumentBase
* base class for xml file parse
* all this pachage's is work for xml file, and method is action as DOM.
*
* 1\ add/update/remove data of xml file.
* 2\ explode data to array.
* 3\ rebuild xml file
*
* @package SmartWeb.common.xml
* @abstract
* @version 1.0
*/
abstract class SimpleDocumentBase
{
private $values =
array();
{
$this->nodeTag = $nodeTag;
}
{
return $this->nodeTag;
}
$this->values = $values;
}
{
$this->values[$name] = $value;
}
{
return $name==null?
$this->values: $this->values[$name];
}
{
unset($this->values["$name"]);
}
$this->attributes = $attributes;
}
{
$this->attributes[$name] = $value;
}
{
return $name==null? $this->attributes:
$this->attributes[$name];
}
{
unset($this->attributes["$name"]);
}
{
return sizeof($this->nodes);
}
{
$this->nodes[$name]
= $nodeId;
}
{
return $name==null? $this->nodes: $this->nodes[$name];
}
{
$tmpObject = $rootNodeObj->createNodeObject($pId, $name, $attributes);
$key = isset($attributes[id])?
$name.'_'.$attributes[id]: $name.'_'.$this->getNodesSize();
$this->setNode($key, $tmpObject->getSeq());
return $tmpObject;
}
{
$rootNodeObj->removeNodeById($this->getNodeId($name));
if(sizeof($this->nodes)==1)
$this->nodes = array();
else
unset($this->nodes[$name]);
}
{
if($name==null)
{
$tmpList = array();
$tmpIds = $this->getNodeId();
foreach($tmpIds as $key=>$id)
$tmpList[$key] = $rootNodeObj->getNodeById($id);
return $tmpList;
}
else
{
$id = $this->getNodeId($name);
if($id===null)
{
$tmpIds = $this->getNodeId();
{
if(strpos($key, $name)==0)
{
$id = $tid;
break;
}
}
}
return $rootNodeObj->getNodeById($id);
}
}
{
$pos = strpos($path, '|');
if($pos {
return $this->getNode($path);
}
else
{
$pos));
$tmpObj->findNodeByPath(substr($path,
$pos+1)):
null;
}
}
{
$data = $this->values;
if(sizeof($this->attributes)>0)
$nodeList = $this->getNode();
if($nodeList==null)
foreach($nodeList as $key=>$node)
{
$data[$key] = $node->getSaveData();
}
}
public function getSaveXml($level=0)
{
= str_pad("",
$level, "\t");
$str = "$prefixSpacenodeTag";
$str .= " $key=\"$value\"";
foreach($this->values as $key=>$value){
{
$str .= "$prefixSpace\t
}
else
$str .= "$prefixSpace\t
}
$tmpStr = trim(trim($tmpStr, "\r\n"));
$str .= $node->getSaveXml($level+1)."\r\n";
$str .= "$prefixSpace$this->nodeTag>";
}
{
unset($this->nodes, $this->attributes, $this->values);
?>
*==============================================
*
* @author hahawen(大龄青年)
* @since 2004-12-04
* @copyright Copyright (c) 2004, NxCoder Group
*
*==============================================
*/
/**
* class SimpleDocumentRoot
* xml root class, include values/attributes/subnodes.
* all this pachage's is work for xml file, and method is action as DOM.
*
* @package SmartWeb.common.xml
* @version 1.0
*/
{
private $prefixStr = '';
private $nodeLists = array();
{
parent::__construct($nodeTag);
}
{
$seq = sizeof($this->nodeLists);
$tmpObject = new SimpleDocumentNode($this,
$pNodeId, $name, $seq);
$tmpObject->setAttributes($attributes);
return $tmpObject;
}
{
if(sizeof($this->nodeLists)==1)
$this->nodeLists = array();
else
unset($this->nodeLists[$id]);
}
{
return $this->nodeLists[$id];
}
{
return $this->createNodeByName($this, $name, $attributes, -1);
}
{
return $this->removeNodeByName($this, $name);
}
{
return $this->getNodeByName($this, $name);
}
{
$prefixSpace = "";
$str = $this->prefixStr."\r\n";
return $str.parent::getSaveXml(0);
}
}
?>
*===============================================
*
* @author hahawen(大龄青年)
* @since 2004-12-04
* @copyright Copyright (c) 2004, NxCoder Group
*
*===============================================
*/
/**
* class SimpleDocumentNode
* xml Node class, include values/attributes/subnodes.
* all this pachage's is work for xml file, and method is action as DOM.
*
* @package SmartWeb.common.xml
* @version 1.0
*/
class SimpleDocumentNode extends SimpleDocumentBase
{
private $seq = null;
private $rootObject = null;
private $pNodeId = null;
{
parent::__construct($nodeTag);
$this->rootObject = $rootObject;
$this->pNodeId = $pNodeId;
$this->seq = $seq;
}
{
return ($this->pNodeId==-1)?
$this->rootObject:
$this->rootObject->getNodeById($this->pNodeId);
}
return $this->seq;
}
{
return $this->createNodeByName($this->rootObject,
$name, $attributes,
$this->getSeq());
}
{
return $this->removeNodeByName($this->rootObject, $name);
}
public function getNode($name=null)
{
return $this->getNodeByName($this->rootObject,
$name);
}
}
?>
下面是通过函数getSaveData()返回的整个xml数据的数组
Array
(
[name] => 华联
[address] => 北京长安街-9999号
[desc] => 连锁超市
[cat_food] => Array
(
[attrs] => Array
(
[id] => food
)
[goods_food11] => Array
(
[name] => food11
[price] => 12.90
[attrs] => Array
(
[id] => food11
)
)
[goods_food12] => Array
(
[name] => food12
[price] => 22.10
[desc] => Array
(
[value] => 好东西推荐
[attrs] => Array
(
[creator] => hahawen
)
)
[attrs] => Array
(
[id] => food12
)
)
)
[cat_1] => Array
(
[goods_tel21] => Array
(
[name] => tel21
[price] => 1290
[attrs] => Array
(
[id] => tel21
)
)
)
[cat_coat] => Array
(
[attrs] => Array
(
[id] => coat
)
[goods_coat31] => Array
(
[name] => coat31
[price] => 112
[attrs] => Array
(
[id] => coat31
)
)
[goods_coat32] => Array
(
[name] => coat32
[price] => 45
[attrs] => Array
(
[id] => coat32
)
)
)
[special_hot] => Array
(
[attrs] => Array
(
[id] => hot
)
[goods_0] => Array
(
[name] => hot41
[price] => 99
)
)
)
下面是通过setValue()函数,给给根节点添加信息,添加后显示出结果xml文件的内容
北京长安街-9999号
下面是通过getNode()函数,返回某一个分类下的所有商品的信息
商品名:food11
Array
(
[name] => food11
[price] => 12.90
)
Array
(
[id] => food11
)
商品名:food12
Array
(
[name] => food12
[price] => 22.10
[desc] => Array
(
[value] => 好东西推荐
[attrs] => Array
(
[creator] => hahawen
)
)
)
Array
(
[id] => food12
)
下面是通过findNodeByPath()函数,返回某一商品的信息
商品名:food11
Array
(
[name] => food11
[price] => 12.90
)
Array
(
[id] => food11
)
下面是通过setValue()函数,给商品"food11"添加属性, 然后显示添加后的结果
北京长安街-9999号
下面是通过removeValue()/removeAttribute()函数,给商品"food11"改变和删除属性, 然后显示操作后的结果
北京长安街-9999号
下面是通过createNode()函数,添加商品, 然后显示添加后的结果
北京长安街-9999号
下面是通过removeNode()函数,删除商品, 然后显示删除后的结果
北京长安街-9999号

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go 언어는 클로저와 리플렉션이라는 두 가지 동적 함수 생성 기술을 제공합니다. 클로저는 클로저 범위 내의 변수에 대한 액세스를 허용하며 리플렉션은 FuncOf 함수를 사용하여 새 함수를 생성할 수 있습니다. 이러한 기술은 HTTP 라우터를 사용자 정의하고 고도로 사용자 정의 가능한 시스템을 구현하며 플러그 가능한 구성 요소를 구축하는 데 유용합니다.

C++ 함수 이름 지정에서는 가독성을 높이고 오류를 줄이며 리팩토링을 용이하게 하기 위해 매개변수 순서를 고려하는 것이 중요합니다. 일반적인 매개변수 순서 규칙에는 작업-객체, 개체-작업, 의미론적 의미 및 표준 라이브러리 준수가 포함됩니다. 최적의 순서는 함수의 목적, 매개변수 유형, 잠재적인 혼동 및 언어 규칙에 따라 달라집니다.

효율적이고 유지 관리 가능한 Java 함수를 작성하는 핵심은 단순함을 유지하는 것입니다. 의미 있는 이름을 사용하세요. 특별한 상황을 처리합니다. 적절한 가시성을 사용하십시오.

1. SUM 함수는 열이나 셀 그룹의 숫자를 합하는 데 사용됩니다(예: =SUM(A1:J10)). 2. AVERAGE 함수는 열이나 셀 그룹에 있는 숫자의 평균을 계산하는 데 사용됩니다(예: =AVERAGE(A1:A10)). 3. COUNT 함수, 열이나 셀 그룹의 숫자나 텍스트 수를 세는 데 사용됩니다. 예: =COUNT(A1:A10) 4. IF 함수, 지정된 조건을 기반으로 논리적 판단을 내리고 결과를 반환하는 데 사용됩니다. 해당 결과.

PHPXML 함수를 사용하여 XML 데이터 처리: XML 데이터 구문 분석: simplexml_load_file() 및 simplexml_load_string()은 XML 파일 또는 문자열을 로드합니다. XML 데이터에 액세스: SimpleXML 개체의 속성과 메서드를 사용하여 요소 이름, 속성 값 및 하위 요소를 가져옵니다. XML 데이터 수정: addChild() 및 addAttribute() 메서드를 사용하여 새 요소와 속성을 추가합니다. 직렬화된 XML 데이터: asXML() 메서드는 SimpleXML 객체를 XML 문자열로 변환합니다. 실제 예: 제품 피드 XML을 구문 분석하고, 제품 정보를 추출하고, 변환하여 데이터베이스에 저장합니다.

C++의 예외 처리는 특정 오류 메시지, 상황별 정보를 제공하고 오류 유형에 따라 사용자 지정 작업을 수행하는 사용자 지정 예외 클래스를 통해 향상될 수 있습니다. 특정 오류 정보를 제공하려면 std::Exception에서 상속된 예외 클래스를 정의하세요. 사용자 정의 예외를 발생시키려면 throw 키워드를 사용하십시오. try-catch 블록에서 Dynamic_cast를 사용하여 발견된 예외를 사용자 지정 예외 유형으로 변환합니다. 실제 경우 open_file 함수는 FileNotFoundException 예외를 발생시킵니다. 예외를 포착하고 처리하면 보다 구체적인 오류 메시지가 제공될 수 있습니다.

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

Go의 함수에 지도를 전달하면 기본적으로 복사본이 생성되며 복사본을 수정해도 원본 지도에는 영향을 미치지 않습니다. 원본 지도를 수정해야 하는 경우 포인터를 통해 전달할 수 있습니다. 빈 맵은 기술적으로 nil 포인터이기 때문에 주의해서 처리해야 하며, 비어 있지 않은 맵을 기대하는 함수에 빈 맵을 전달하면 오류가 발생합니다.
