Maison  >  Article  >  développement back-end  >  Opération XML implémentée par php (analyse complète de l'instance de classe encapsulée

Opération XML implémentée par php (analyse complète de l'instance de classe encapsulée

墨辰丷
墨辰丷original
2018-05-25 09:59:431766parcourir

Cet article présente principalement la classe d'encapsulation d'opération XML (lecture) implémentée par PHP, donne un exemple de fichier au format XML et analyse les compétences opérationnelles associées de PHP traversant et lisant des nœuds de données au format XML sous la forme d'un exemple complet . Il est obligatoire que les amis puissent se référer à

comme suit :

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<CustomizationSetting version=&#39;1.0&#39; >
  <!-- 各通用配置信息,作为Settings子节点,方便统一解析 -->
  <!-- AgentSettings 由网页定制生成,默认无次节点-->
  <AgentSettings>
    <!-- 以Setting 作为节点名,考虑扩展时,不需修改客户端接口。 type类型方便网页进行显示控件区分 -->
    <!-- 代理定制类型,默认:Normal。在网页区分语言定制的情况下,以英文、或列表第一种语言的修改为准 -->
    <Setting name=&#39;CustomizeType&#39; type=&#39;enum&#39;>Normal|DR</Setting>
    <!-- 产品名称,AgentType为DR时,用于获取代理购买地址 -->
    <Setting name=&#39;AppName&#39; type=&#39;string&#39;>Wondershare Vedio Convertor</Setting>
    <!-- 品牌名称,AgentType为DR时,用于获取代理购买地址 -->
    <Setting name=&#39;Publisher&#39; type=&#39;string&#39;>Wondershare</Setting>
    <!-- 购买地址生成方式,默认:Customize,由网页生成,默认无次节点 -->
    <Setting name=&#39;OrderPageGenType&#39; type=&#39;enum&#39;>Customize|Affiliate</Setting>
    <!-- Affiliate ID, OrderPageGenType为Affiliate才有效,默认为空值 -->
    <Setting name=&#39;AID&#39; type=&#39;string&#39;>143724583</Setting>
    <!-- 启动Affiliat 购买地址启用短链接, OrderPageGenType为Affiliate才有效,默认:0 -->
    <Setting name=&#39;UseShortAffiliateOrderLink&#39; type=&#39;bool&#39;>0|1</Setting>
    <!-- 定制输出名称 -->
    <Setting name=&#39;OutputFileName&#39; type=&#39;string&#39;><![CDATA[1464646.mac-transpod-lite_full879.dmg]]></Setting>
  </AgentSettings>
  <!-- 各语言定制信息,作为Languages子节点,方便统一解析, 以及扩展 -->
  <Languages>
    <!-- 语言名称,统一使用CBS后台语言数据规范 -->
    <Language name=&#39;English&#39; >
      <Settings>
        <!-- 产品ID,多语言中可被定制 -->
        <Setting name=&#39;PID&#39; type=&#39;stirng&#39;>11642</Setting>
        <!-- 支持弹出广告,默认:1,最终能否弹广告还取决于网站的设置,这里主要用于关闭的总控制 -->
        <Setting name=&#39;EnabelAD&#39; type=&#39;bool&#39;>1|0</Setting>
        <!-- 支持升级,默认:1 -->
        <Setting name=&#39;EnableUpdate&#39; type=&#39;bool&#39;>1|0</Setting>
        <!-- CBS跳转链接类型,只对InstallJumpPage,UninstallJumpPage,RegisterJumpPage,UpdateJumpPage有效,默认:Jump -->
        <Setting name=&#39;CBSJumpType&#39; type=&#39;enum&#39;>Jump|Hide|Disable</Setting>
        <!-- 支持Tisp消息-->
        <Setting name=&#39;TipsEnable&#39; type=&#39;bool&#39;>1|0</Setting>
        <!-- 支持弹出产品目录推荐, 默认:1-->
        <Setting name=&#39;EnableProductSuit&#39; type=&#39;bool&#39;>1|0</Setting>
      </Settings>
      <!-- 链接地址作为URLS子节点,方便统一解析 -->
      <URLS>
        <!-- 不使用&#39;**Page&#39;直接作为节点名称,避免自定义地址的名称与XML节点名称规范冲突,如就数字开头,同时支持网页界面根据不同产品显示链接名称,而且扩展时,而不需修改客户端接口 -->
        <!-- 购买地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <!-- 区分地址类型order, jump, comm, custom方便网页显示归类 -->
        <URL name=&#39;OrderPage&#39; type=&#39;order&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 安装跳转地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;InstallJumpPage&#39; type=&#39;jump&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 卸载跳转地址,Mac产品无此项。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;UninstallJumpPage&#39; type=&#39;jump&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 注册跳转地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;RegisterJumpPage&#39; type=&#39;jump&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 升级跳转地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;UpdateJumpPage&#39; type=&#39;jump&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 公司主页地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;HomePage&#39; type=&#39;comm&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 产品主页地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;ProductPage&#39; type=&#39;comm&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 支持地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;SupportPage&#39; type=&#39;comm&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 联系客服地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;ContactPage&#39; type=&#39;comm&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 在线帮助地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;HelpOnlinePage&#39; type=&#39;comm&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 自定义地址,最多可定义5个。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;3DPage&#39; type=&#39;custom&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
        <!-- 自定义地址,最多可定义5个。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 -->
        <URL name=&#39;GPUPage&#39; type=&#39;custom&#39; updateReserve=&#39;0|1&#39;><![CDATA[http://...]]></URL>
      </URLS>
      <!-- 待扩展信息,在客户端接口中预先处理 -->
    </Language>
    <!-- 产品不支持某种语言,则不需要该<Language>节点 -->
    <Language name=&#39;Traditional Chinese(HK)&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Chinese&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Portuguese&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Japanese&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Korean&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Hebrew&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Arabic&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Spanish&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Polish&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;German&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;French&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Italian&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Spanish(Spain)&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Spanish(Mexico)&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Traditional Chinese(TW)&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Dutch&#39;>
        <!-- 同上 -->
    </Language>
    <Language name=&#39;Russian&#39;>
        <!-- 同上 -->
    </Language>
  </Languages>
</CustomizationSetting>

encapsule la classe d'opération XML de lecture :

<?php
/**
 * xml操作基类
 */
class XmlBase {
  public function __construct() {
  }
  /**
   * 加载xml
   * @param string $xml xml路径或xml字符串
   * @param bool $isXmlStr 是否是xml字符串
   */
  protected function _loadXml($xml, $isXmlStr = FALSE) {
    $xmlObj = new DOMDocument();
    if ($isXmlStr) {
      $xmlObj->loadXML($xmlNewStr);
    } else {
      $xmlObj->load($xml);
    }
    return $xmlObj;
  }
  /**
   * 获取某个标签节点
   * @param $parentnode 父节点
   * @param $tagName 标签名 // 不区分大小写
   * @return node 节点对象
   */
  protected function _getNode($parentNode, $tagName) {
    $childNodes = $this->_getNodes($parentNode);
    foreach ($childNodes as $node) {
      $nodeName = strtolower(trim($node->nodeName));
      $tagName = strtolower(trim($tagName));
      if ($nodeName == $tagName) {
        return $node;
      }
    }
    return NULL;
  }
  /**
   * 获取xml子节点
   * @param $parentNode 父节点
   * @param $tagName 子节点标签 // 不区分大小写
   */
  protected function _getNodes($parentNode, $tagName = &#39;&#39;) {
    $nodes = array();
    if ($tagName) {
      $nodes = $this->_getSpecialNodes($parentNode, $tagName);
    } else {
      $nodes = $this->_getAllNodes($parentNode);
    }
    return $nodes;
  }
  /**
   * 获取所有的节点
   * @param $parentNode 父节点
   */
  protected function _getAllNodes($parentNode) {
    $nodes = array();
    foreach ($parentNode->childNodes as $node) {
      if ($node->nodeType == 1) {
        $nodes[] = $node;
      }
    }
    return $nodes;
  }
  /**
   * 获取指定标签的节点
   * @param $parentNode 父节点
   * @param $tagName 节点名称
   */
  protected function _getSpecialNodes($parentNode, $tagName) {
    $nodes = array();
    $tagName = strtolower(trim($tagName));
    foreach ($parentNode->childNodes as $node) {
      $nodeName = strtolower(trim($node->nodeName));
      if ($node->nodeType == 1 && $nodeName == $tagName) {
        $nodes[] = $node;
      }
    }
    return $nodes;
  }
  /**
   * 获取节点属性值
   *
   * @param $node 节点对象
   * @param $attrName 节点名字 // 不区分大小写
   */
  protected function _getAttr($node, $attrName) {
    $attrName = strtolower($attrName);
    foreach ($node->attributes as $attr) {
      $nodeName = strtolower($attr->nodeName);
      //$nodeValue = strtolower($attr->nodeValue);
      $nodeType = strtolower($attr->nodeType);
      if ($nodeType == 2 && $nodeName == $attrName) {
        unset($attrName, $nodeName, $nodeType);
        return $attr->nodeValue;
      }
    }
    return &#39;&#39;;
  }
}
?>

Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.


Recommandations associées :

Implémentation PHP de la lecture du fichier xml

Résumé des exemples de méthodes courantes permettant à php de lire les astuces XML_php

Caractéristiques et instructions de syntaxe pour la technologie PHP et XML

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn