C# XML操作类(修改,删除,新增,创建)
来源:网络来源TAG:XML操作类浏览数: 日期:2010-7-27评论:
折叠C# Code复制内容到剪贴板
  1. **********************************************************************************   
  2.  *    
  3.  * 功能说明:XML处理基类   
  4.  * 作者: 刘功勋;   
  5.  * 版本:V0.1(C#2.0);时间:2006-12-13   
  6.  *    
  7.  * *******************************************************************************/   
  8. using System;   
  9. using System.Data;   
  10. using System.Configuration;   
  11. using System.Web;   
  12. using System.Web.Security;   
  13. using System.Web.UI;   
  14. using System.Web.UI.WebControls;   
  15. using System.Web.UI.WebControls.WebParts;   
  16. using System.Web.UI.HtmlControls;   
  17. using System.IO;   
  18. using System.Xml;   
  19. using System.Text;   
  20. using MSXML2;   
  21.   
  22.   
  23. namespace EC   
  24. ...{   
  25.     /**//// <summary>   
  26.     /// XML 操作基类   
  27.     /// </summary>   
  28.     public class XmlObject : IDisposable   
  29.     ...{         
  30.           
  31.              
  32.   
  33.            
  34.         //以下为单一功能的静态类   
  35.            
  36.         读取XML到DataSet#region 读取XML到DataSet   
  37.         /**//**************************************************  
  38.          * 函数名称:GetXml(string XmlPath)  
  39.          * 功能说明:读取XML到DataSet  
  40.          * 参    数:XmlPath:xml文档路径  
  41.          * 使用示列:  
  42.          *          using EC; //引用命名空间  
  43.          *          string xmlPath = Server.MapPath("/EBDnsConfig/DnsConfig.xml"); //获取xml路径  
  44.          *          DataSet ds = EC.XmlObject.GetXml(xmlPath); //读取xml到DataSet中  
  45.          ************************************************/  
  46.         /**//// <summary>   
  47.         /// 功能:读取XML到DataSet中   
  48.         /// </summary>   
  49.         /// <param name="XmlPath">xml路径</param>   
  50.         /// <returns>DataSet</returns>   
  51.         public static DataSet GetXml(string XmlPath)   
  52.         ...{   
  53.             DataSet ds = new DataSet();   
  54.             ds.ReadXml(@XmlPath);   
  55.             return ds;   
  56.         }  
  57.         #endregion   
  58.   
  59.         读取xml文档并返回一个节点#region 读取xml文档并返回一个节点   
  60.         /**//**************************************************  
  61.          * 函数名称:ReadXmlReturnNode(string XmlPath,string Node)  
  62.          * 功能说明:读取xml文档并返回一个节点:适用于一级节点  
  63.          * 参    数: XmlPath:xml文档路径;Node 返回的节点名称   
  64.          * 适应用Xml:<?xml version="1.0" encoding="utf-8" ?>  
  65.          *           <root>  
  66.          *               <dns1>ns1.everdns.com</dns1>  
  67.          *          </root>  
  68.          * 使用示列:  
  69.          *          using EC; //引用命名空间  
  70.          *          string xmlPath = Server.MapPath("/EBDnsConfig/DnsConfig.xml"); //获取xml路径  
  71.          *          Response.Write(XmlObject.ReadXmlReturnNode(xmlPath, "mailmanager"));  
  72.          ************************************************/  
  73.         /**//// <summary>   
  74.         /// 读取xml文档并返回一个节点:适用于一级节点   
  75.         /// </summary>   
  76.         /// <param name="XmlPath">xml路径</param>   
  77.         /// <param name="NodeName">节点</param>   
  78.         /// <returns></returns>   
  79.         public static string ReadXmlReturnNode(string XmlPath,string Node)   
  80.         ...{   
  81.             XmlDocument docXml = new XmlDocument();   
  82.             docXml.Load(@XmlPath);   
  83.             XmlNodeList xn = docXml.GetElementsByTagName(Node);   
  84.             return xn.Item(0).InnerText.ToString();              
  85.         }  
  86.         #endregion   
  87.   
  88.         查找数据,返回一个DataSet#region 查找数据,返回一个DataSet   
  89.         /**//**************************************************  
  90.          * 函数名称:GetXmlData(string xmlPath, string XmlPathNode)  
  91.          * 功能说明:查找数据,返回当前节点的所有下级节点,填充到一个DataSet中  
  92.          * 参    数:xmlPath:xml文档路径;XmlPathNode:当前节点的路径  
  93.          * 使用示列:  
  94.          *          using EC; //引用命名空间  
  95.          *          string xmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径  
  96.          *          DataSet ds = new DataSet();  
  97.          *          ds = XmlObject.GetXmlData(xmlPath, "root/items");//读取当前路径  
  98.          *          this.GridView1.DataSource = ds;  
  99.          *          this.GridView1.DataBind();  
  100.          *          ds.Clear();  
  101.          *          ds.Dispose();  
  102.          * Xml示例:  
  103.          *         <?xml version="1.0" encoding="utf-8" ?>  
  104.          *            <root>  
  105.          *              <items name="xinnet">  
  106.          *                <url>http://www.paycenter.com.cn/cgi-bin/</url>  
  107.          *                <port>80</port>  
  108.          *              </items>  
  109.          *            </root>  
  110.          ************************************************/  
  111.         /**//// <summary>   
  112.         /// 查找数据,返回当前节点的所有下级节点,填充到一个DataSet中   
  113.         /// </summary>   
  114.         /// <param name="xmlPath">xml文档路径</param>   
  115.         /// <param name="XmlPathNode">节点的路径:根节点/父节点/当前节点</param>   
  116.         /// <returns></returns>   
  117.         public static DataSet GetXmlData(string xmlPath, string XmlPathNode)   
  118.         ...{   
  119.             XmlDocument objXmlDoc = new XmlDocument();   
  120.             objXmlDoc.Load(xmlPath);   
  121.             DataSet ds = new DataSet();   
  122.             StringReader read = new StringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml);   
  123.             ds.ReadXml(read);   
  124.             return ds;           
  125.         }  
  126.  
  127.  
  128.         #endregion   
  129.   
  130.         更新Xml节点内容#region 更新Xml节点内容   
  131.         /**//**************************************************  
  132.          * 函数名称:XmlNodeReplace(string xmlPath,string Node,string Content)  
  133.          * 功能说明:更新Xml节点内容  
  134.          * 参    数:xmlPath:xml文档路径;Node:当前节点的路径;Content:内容  
  135.          * 使用示列:  
  136.          *          using EC; //引用命名空间  
  137.          *          string xmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径  
  138.          *          XmlObject.XmlNodeReplace(xmlPath, "root/test", "56789");  //更新节点内容  
  139.          ************************************************/  
  140.         /**//// <summary>   
  141.         /// 更新Xml节点内容   
  142.         /// </summary>   
  143.         /// <param name="xmlPath">xml路径</param>   
  144.         /// <param name="Node">要更换内容的节点:节点路径 根节点/父节点/当前节点</param>   
  145.         /// <param name="Content">新的内容</param>   
  146.         public static void XmlNodeReplace(string xmlPath,string Node,string Content)   
  147.         ...{   
  148.             XmlDocument objXmlDoc = new XmlDocument();   
  149.             objXmlDoc.Load(xmlPath);   
  150.             objXmlDoc.SelectSingleNode(Node).InnerText = Content;   
  151.             objXmlDoc.Save(xmlPath);   
  152.                
  153.         }  
  154.  
  155.         #endregion   
  156.   
  157.         删除XML节点和此节点下的子节点#region 删除XML节点和此节点下的子节点   
  158.         /**//**************************************************  
  159.          * 函数名称:XmlNodeDelete(string xmlPath,string Node)  
  160.          * 功能说明:删除XML节点和此节点下的子节点  
  161.          * 参    数:xmlPath:xml文档路径;Node:当前节点的路径;  
  162.          * 使用示列:  
  163.          *          using EC; //引用命名空间  
  164.          *          string xmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径  
  165.          *          XmlObject.XmlNodeDelete(xmlPath, "root/test");  //删除当前节点  
  166.          ************************************************/  
  167.         /**//// <summary>   
  168.         /// 删除XML节点和此节点下的子节点   
  169.         /// </summary>   
  170.         /// <param name="xmlPath">xml文档路径</param>   
  171.         /// <param name="Node">节点路径</param>   
  172.         public static void XmlNodeDelete(string xmlPath,string Node)   
  173.         ...{   
  174.             XmlDocument objXmlDoc = new XmlDocument();   
  175.             objXmlDoc.Load(xmlPath);   
  176.             string mainNode = Node.Substring(0, Node.LastIndexOf("/"));   
  177.             objXmlDoc.SelectSingleNode(mainNode).RemoveChild(objXmlDoc.SelectSingleNode(Node));   
  178.             objXmlDoc.Save(xmlPath);   
  179.         }  
  180.  
  181.         #endregion   
  182.   
  183.         插入一个节点和此节点的字节点#region 插入一个节点和此节点的字节点   
  184.         /**//**************************************************  
  185.          * 函数名称:XmlInsertNode(string xmlPath, string MailNode, string ChildNode, string Element,string Content)  
  186.          * 功能说明:插入一个节点和此节点的字节点  
  187.          * 参    数:xmlPath:xml文档路径;MailNode:当前节点的路径;ChildNode:新插入的节点;Element:插入节点的子节点;Content:子节点的内容  
  188.          * 使用示列:  
  189.          *          using EC; //引用命名空间  
  190.          *          string xmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径  
  191.          *          XmlObject.XmlInsertNode(xmlPath, "root/test","test1","test2","测试内容");  //插入一个节点和此节点的字节点  
  192.          * 生成的XML格式为  
  193.          *          <test>  
  194.          *               <test1>  
  195.          *                    <test2>测试内容</test2>  
  196.          *                </test1>  
  197.          *            </test>  
  198.          ************************************************/  
  199.         /**//// <summary>   
  200.         /// 插入一个节点和此节点的字节点   
  201.         /// </summary>   
  202.         /// <param name="xmlPath">xml路径</param>   
  203.         /// <param name="MailNode">当前节点路径</param>   
  204.         /// <param name="ChildNode">新插入节点</param>   
  205.         /// <param name="Element">插入节点的子节点</param>   
  206.         /// <param name="Content">子节点的内容</param>   
  207.         public static void XmlInsertNode(string xmlPath, string MailNode, string ChildNode, string Element,string Content)   
  208.         ...{   
  209.             XmlDocument objXmlDoc = new XmlDocument();   
  210.             objXmlDoc.Load(xmlPath);   
  211.             XmlNode objRootNode = objXmlDoc.SelectSingleNode(MailNode);   
  212.             XmlElement objChildNode = objXmlDoc.CreateElement(ChildNode);   
  213.             objRootNode.AppendChild(objChildNode);   
  214.             XmlElement objElement = objXmlDoc.CreateElement(Element);   
  215.             objElement.InnerText = Content;   
  216.             objChildNode.AppendChild(objElement);   
  217.             objXmlDoc.Save(xmlPath);   
  218.         }  
  219.  
  220.         #endregion   
  221.   
  222.         插入一节点,带一属性#region 插入一节点,带一属性   
  223.         /**//**************************************************  
  224.          * 函数名称:XmlInsertElement(string xmlPath, string MainNode, string Element, string Attrib, string AttribContent, string Content)  
  225.          * 功能说明:插入一节点,带一属性  
  226.          * 参    数:xmlPath:xml文档路径;MailNode:当前节点的路径;Element:新插入的节点;Attrib:属性名称;AttribContent:属性值;Content:节点的内容  
  227.          * 使用示列:  
  228.          *          using EC; //引用命名空间  
  229.          *          string xmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径  
  230.          *         XmlObject.XmlInsertElement(xmlPath, "root/test", "test1", "Attrib", "属性值", "节点内容");  //插入一节点,带一属性  
  231.          * 生成的XML格式为  
  232.          *          <test>  
  233.          *              <test1 Attrib="属性值">节点内容</test1>  
  234.          *          </test>  
  235.          ************************************************/  
  236.         /**//// <summary>   
  237.         /// 插入一节点,带一属性   
  238.         /// </summary>   
  239.         /// <param name="xmlPath">Xml文档路径</param>   
  240.         /// <param name="MainNode">当前节点路径</param>   
  241.         /// <param name="Element">新节点</param>   
  242.         /// <param name="Attrib">属性名称</param>   
  243.         /// <param name="AttribContent">属性值</param>   
  244.         /// <param name="Content">新节点值</param>   
  245.         public static void XmlInsertElement(string xmlPath, string MainNode, string Element, string Attrib, string AttribContent, string Content)   
  246.         ...{   
  247.             XmlDocument objXmlDoc = new XmlDocument();   
  248.             objXmlDoc.Load(xmlPath);   
  249.             XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);   
  250.             XmlElement objElement = objXmlDoc.CreateElement(Element);   
  251.             objElement.SetAttribute(Attrib, AttribContent);   
  252.             objElement.InnerText = Content;   
  253.             objNode.AppendChild(objElement);   
  254.             objXmlDoc.Save(xmlPath);   
  255.         }  
  256.  
  257.         #endregion   
  258.   
  259.         插入一节点不带属性#region 插入一节点不带属性   
  260.         /**//**************************************************  
  261.          * 函数名称:XmlInsertElement(string xmlPath, string MainNode, string Element, string Content)  
  262.          * 功能说明:插入一节点不带属性  
  263.          * 参    数:xmlPath:xml文档路径;MailNode:当前节点的路径;Element:新插入的节点;Content:节点的内容  
  264.          * 使用示列:  
  265.          *          using EC; //引用命名空间  
  266.          *          string xmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径  
  267.          *          XmlObject.XmlInsertElement(xmlPath, "root/test", "text1", "节点内容");  //插入一节点不带属性  
  268.          * 生成的XML格式为  
  269.          *          <test>  
  270.          *                  <text1>节点内容</text1>  
  271.          *          </test>  
  272.          ************************************************/  
  273.         public static void XmlInsertElement(string xmlPath, string MainNode, string Element, string Content)   
  274.         ...{   
  275.             XmlDocument objXmlDoc = new XmlDocument();   
  276.             objXmlDoc.Load(xmlPath);   
  277.             XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);   
  278.             XmlElement objElement = objXmlDoc.CreateElement(Element);   
  279.             objElement.InnerText = Content;   
  280.             objNode.AppendChild(objElement);   
  281.             objXmlDoc.Save(xmlPath);   
  282.         }  
  283.  
  284.         #endregion   
  285.           
  286.   
  287.         //必须创建对象才能使用的类   
  288.   
  289.         private bool _alreadyDispose = false;   
  290.         private string xmlPath;    
  291.         private XmlDocument xmlDoc=new XmlDocument();      
  292.   
  293.         private XmlNode xmlNode;   
  294.         private XmlElement xmlElem;       
  295.   
  296.         构造与释构#region 构造与释构   
  297.         public XmlObject()   
  298.         ...{               
  299.   
  300.         }          
  301.         ~XmlObject()   
  302.         ...{   
  303.             Dispose();   
  304.         }   
  305.         protected virtual void Dispose(bool isDisposing)   
  306.         ...{   
  307.             if (_alreadyDispose) return;   
  308.             if (isDisposing)   
  309.             ...{   
  310.                //   
  311.             }   
  312.             _alreadyDispose = true;   
  313.         }  
  314.         #endregion   
  315.   
  316.         IDisposable 成员#region IDisposable 成员   
  317.   
  318.         public void Dispose()   
  319.         ...{   
  320.             Dispose(true);   
  321.             GC.SuppressFinalize(this);   
  322.         }  
  323.  
  324.         #endregion   
  325.   
  326.         创建xml文档#region 创建xml文档   
  327.         /**//**************************************************  
  328.          * 对象名称:XmlObject  
  329.          * 功能说明:创建xml文档          
  330.          * 使用示列:  
  331.          *          using EC; //引用命名空间  
  332.          *          string xmlPath = Server.MapPath("test.xml");  
  333.          *          XmlObject obj = new XmlObject();  
  334.          *          创建根节点  
  335.          *          obj.CreateXmlRoot("root");  
  336.          *          // 创建空节点  
  337.          *          //obj.CreatXmlNode("root", "Node");  
  338.          *          //创建一个带值的节点  
  339.          *          //obj.CreatXmlNode("root", "Node", "带值的节点");  
  340.          *          //创建一个仅带属性的节点  
  341.          *          //obj.CreatXmlNode("root", "Node", "Attribe", "属性值");  
  342.          *          //创建一个仅带两个属性值的节点  
  343.          *          //obj.CreatXmlNode("root", "Node", "Attribe", "属性值", "Attribe2", "属性值2");  
  344.          *          //创建一个带属性值的节点值的节点  
  345.          *          // obj.CreatXmlNode("root", "Node", "Attribe", "属性值","节点值");  
  346.          *          //在当前节点插入带两个属性值的节点  
  347.          *          obj.CreatXmlNode("root", "Node", "Attribe", "属性值", "Attribe2", "属性值2","节点值");  
  348.          *          obj.XmlSave(xmlPath);  
  349.          *          obj.Dispose();          
  350.          ************************************************/  
  351.   
  352.   
  353.         创建一个只有声明和根节点的XML文档#region 创建一个只有声明和根节点的XML文档   
  354.         /**//// <summary>   
  355.         /// 创建一个只有声明和根节点的XML文档   
  356.         /// </summary>   
  357.         /// <param name="root"></param>   
  358.         public void CreateXmlRoot(string root)   
  359.         ...{   
  360.           //加入XML的声明段落   
  361.             xmlNode = xmlDoc.CreateNode(XmlNodeType.XmlDeclaration, """");   
  362.             xmlDoc.AppendChild(xmlNode);   
  363.             //加入一个根元素   
  364.             xmlElem = xmlDoc.CreateElement("", root, "");   
  365.             xmlDoc.AppendChild(xmlElem);   
  366.   
  367.         }  
  368.         #endregion   
  369.   
  370.         在当前节点下插入一个空节点节点#region 在当前节点下插入一个空节点节点   
  371.         /**//// <summary>   
  372.         /// 在当前节点下插入一个空节点节点   
  373.         /// </summary>   
  374.         /// <param name="mainNode">当前节点路径</param>   
  375.         /// <param name="node">节点名称</param>   
  376.         public void CreatXmlNode(string mainNode,string node)   
  377.         ...{   
  378.             XmlNode MainNode = xmlDoc.SelectSingleNode(mainNode);   
  379.             XmlElement objElem = xmlDoc.CreateElement(node);               
  380.             MainNode.AppendChild(objElem);   
  381.         }  
  382.         #endregion   
  383.   
  384.         在当前节点插入一个仅带值的节点#region 在当前节点插入一个仅带值的节点   
  385.         /**//// <summary>   
  386.         ///  在当前节点插入一个仅带值的节点   
  387.         /// </summary>   
  388.         /// <param name="mainNode">当前节点</param>   
  389.         /// <param name="node">新节点</param>   
  390.         /// <param name="content">新节点值</param>   
  391.         public void CreatXmlNode(string mainNode, string node, string content)   
  392.         ...{   
  393.             XmlNode MainNode = xmlDoc.SelectSingleNode(mainNode);   
  394.             XmlElement objElem = xmlDoc.CreateElement(node);   
  395.             objElem.InnerText = content;   
  396.             MainNode.AppendChild(objElem);   
  397.         }  
  398.         #endregion   
  399.   
  400.         在当前节点的插入一个仅带属性值的节点#region 在当前节点的插入一个仅带属性值的节点   
  401.         /**//// <summary>   
  402.         /// 在当前节点的插入一个仅带属性值的节点   
  403.         /// </summary>   
  404.         /// <param name="MainNode">当前节点或路径</param>   
  405.         /// <param name="Node">新节点</param>   
  406.         /// <param name="Attrib">新节点属性名称</param>   
  407.         /// <param name="AttribValue">新节点属性值</param>   
  408.         public void CreatXmlNode(string MainNode, string Node, string Attrib, string AttribValue)   
  409.         ...{   
  410.             XmlNode mainNode = xmlDoc.SelectSingleNode(MainNode);   
  411.             XmlElement objElem = xmlDoc.CreateElement(Node);   
  412.             objElem.SetAttribute(Attrib, AttribValue);   
  413.             mainNode.AppendChild(objElem);   
  414.         }         
  415.         #endregion   
  416.   
  417.         创建一个带属性值的节点值的节点#region 创建一个带属性值的节点值的节点   
  418.         /**//// <summary>   
  419.         /// 创建一个带属性值的节点值的节点   
  420.         /// </summary>   
  421.         /// <param name="MainNode">当前节点或路径</param>   
  422.         /// <param name="Node">节点名称</param>   
  423.         /// <param name="Attrib">属性名称</param>   
  424.         /// <param name="AttribValue">属性值</param>   
  425.         /// <param name="Content">节点传情</param>   
  426.         public void CreatXmlNode(string MainNode, string Node, string Attrib, string AttribValue,string Content)   
  427.         ...{   
  428.             XmlNode mainNode = xmlDoc.SelectSingleNode(MainNode);   
  429.             XmlElement objElem = xmlDoc.CreateElement(Node);   
  430.             objElem.SetAttribute(Attrib, AttribValue);   
  431.             objElem.InnerText = Content;   
  432.             mainNode.AppendChild(objElem);   
  433.         }         
  434.         #endregion         
  435.   
  436.         在当前节点的插入一个仅带2个属性值的节点#region 在当前节点的插入一个仅带2个属性值的节点   
  437.         /**//// <summary>   
  438.         ///  在当前节点的插入一个仅带2个属性值的节点   
  439.         /// </summary>   
  440.         /// <param name="MainNode">当前节点或路径</param>   
  441.         /// <param name="Node">节点名称</param>   
  442.         /// <param name="Attrib">属性名称一</param>   
  443.         /// <param name="AttribValue">属性值一</param>   
  444.         /// <param name="Attrib2">属性名称二</param>   
  445.         /// <param name="AttribValue2">属性值二</param>   
  446.         public void CreatXmlNode(string MainNode, string Node, string Attrib, string AttribValue,string Attrib2,string AttribValue2)   
  447.         ...{   
  448.             XmlNode mainNode = xmlDoc.SelectSingleNode(MainNode);   
  449.             XmlElement objElem = xmlDoc.CreateElement(Node);   
  450.             objElem.SetAttribute(Attrib, AttribValue);   
  451.             objElem.SetAttribute(Attrib2, AttribValue2);   
  452.             mainNode.AppendChild(objElem);   
  453.         }  
  454.         #endregion   
  455.   
  456.         在当前节点插入带两个属性的节点#region 在当前节点插入带两个属性的节点   
  457.         /**//// <summary>   
  458.         ///  在当前节点插入带两个属性的节点   
  459.         /// </summary>   
  460.         /// <param name="MainNode">当前节点或路径</param>   
  461.         /// <param name="Node">节点名称</param>   
  462.         /// <param name="Attrib">属性名称一</param>   
  463.         /// <param name="AttribValue">属性值一</param>   
  464.         /// <param name="Attrib2">属性名称二</param>   
  465.         /// <param name="AttribValue2">属性值二</param>   
  466.         /// <param name="Content">节点值</param>   
  467.         public void CreatXmlNode(string MainNode, string Node, string Attrib, string AttribValue, string Attrib2, string AttribValue2,string Content)   
  468.         ...{   
  469.             XmlNode mainNode = xmlDoc.SelectSingleNode(MainNode);   
  470.             XmlElement objElem = xmlDoc.CreateElement(Node);   
  471.             objElem.SetAttribute(Attrib, AttribValue);   
  472.             objElem.SetAttribute(Attrib2, AttribValue2);   
  473.             objElem.InnerText = Content;   
  474.             mainNode.AppendChild(objElem);   
  475.         }  
  476.         #endregion   
  477.   
  478.         保存Xml#region 保存Xml   
  479.         /**//// <summary>   
  480.         /// 保存Xml   
  481.         /// </summary>   
  482.         /// <param name="path">保存的当前路径</param>   
  483.         public void XmlSave(string path)   
  484.         ...{   
  485.             xmlDoc.Save(path);   
  486.         }  
  487.  
  488.         #endregion  
  489.  
  490.         #endregion   
  491.   
  492.     }   
  493. }  
昨天新闻点击排行
一周新闻点击排行
当月新闻点击排行
相关评论
正在加载评论列表...
评论表单加载中...