TinyXml节点查找及修改
参考:http://blog.csdn.net/zww0815/article/details/8083550
- // 读者对象:对TinyXml有一定了解的人。本文是对TinyXml工具的一些知识点的理解。
- // 1 TinyXml中对TiXmlNode进行了分类,是用一个枚举进行描述的。
- // enum NodeType
- // {
- // DOCUMENT, 文档节点
- // ELEMENT, 元素节点
- // COMMENT, 还没弄清楚
- // UNKNOWN, 未知节点
- // TEXT, 文本节点
- // DECLARATION, 声明节点
- // TYPECOUNT 还没弄清楚
- // };
- // TiXmlNode * pNode->Type() 函数可以返回节点的类型。
- // 枚举的比较方法:TiXmlText::TEXT == pNode->Type();
- //
- // 这几个类型非常重要,尤其是在遍历xml时或者查找一个节点时
- // 我对节点和元素的理解如下:为了说明问题,我使用下面的xml文档来举例说明
- // <?xml version="1.0" encoding="gb2312"?>
- // <Persons>
- // <person Id="200" Shengao=34 ClassName="计本0508">
- // <name>vertor</name>
- // <age>20</age>
- // <address encode="utf-8">
- // <country>中国</country>
- // <province>山西</province>
- // <village>王大庄</village>
- // </address>
- // </person>
- // </Persons>
- //
- // 2.1 节点:一种对文档结构的描述对象
- // 2.2 元素:对文档某一个数据块的描述
- // 2.3 文本是指没有孩子的节点
- // 例如<village>大王庄</village> 文本节点是:"大王庄"
- // 然而判断一个节点是否是文本节点时并不是根据pNode->NoChildren()来判断,而是根据节点的类型来判断
- // 因为如果一个节点形如:<village></village>它也是没有孩子节点的。
- // 2.4 节点类可以转换成元素对象。
- // 例如 TiXmlElement * pElement = pNode->ToElement();
- // 那什么时候需要转换成元素呢?
- // 当你需要元素的一些属性值是就需要转换了。
- // 2.5 元素跟节点都有关于访问孩子的函数,
- // 元素访问孩子的函数:
- // FirstChildElement() 返回当前元素的孩子元素
- // NextSiblingElement() 返回当前元素的同级元素
- // 节点访问节点孩子的函数:
- // FirstChild() 返回当前节点的孩子节点
- // NextSibing() 返回当前节点的同级下一个节点
- // 个人觉得 元素访问和节点访问在一般的访问下没有区别,两者都可以访问的孩子
- // 对于一些特殊的情况下才需要区分。比如你要访问属性时,就需要用元素来找到第一个属性值。
- // 2.6 对于遍历一个xml文档时,思路一般是这样的:
- // 1 载入一个xml
- // 2 获得根元素(不是根节点)
- // 3 循环访问每一个根元素的子元素
- // 4 对每一个子元素进行解析。
- // 4.1 获取子元素的类型Type
- // 4.2 switch(Type)
- // case TEXT:
- // 输出文本节点的值pNode->value()
- // case ELEMENT:
- // 获取元素的value(这里的value指的是元素的名字,例如:person元素)
- // 循环获取元素的每一个属性
- // a 得到元素的第一个属性
- // b do——while循环获取每一个属性和值。
- // case COMMENT: 暂时不用管
- // case UNKNOWN: 暂时不用管
- // case DECLARATION:
- // 获取元素的版本,编码方式等等
- // 4.3 循环遍历子元素的下一级元素(即孙子元素) 在这里也可以遍历孙子节点。
- // 递归调用第四步。
- // 基本思路就是这样,具体代码见后面
- // 2.7 如果定位一个节点
- // 唯一确定一个节点的方法是根据节点名,属性名,属性值
- // 1 根据xml的遍历思想找到与给定节点名一样的节点
- // 2 如果这个节点有属性并且属性名和值与给定的一致,说明找到了。
- // 3 如果没有一致的,说明解析失败。
- // 4 如果没有给定属性名和值,则可以默认只查找与节点名一致的节点。
- // 2.8 编码问题
- // 用TinyXml加载一个xml文档时,根据文档的编码方式来加载,在操作过程中需要进行编码转换
- // 如果encoding=utf-8 则在遍历时,需要进行编码转换,具体转换还没找到方法。
- //
- // 2.9 指针的 new和释放。
- // TinyXml已经帮我们把指针分配的内存进行了管理,在析构函数中进行了处理,我们不需要处理new出来的指针
- // 如果我们显示的delete时,有可能影响程序运行。
- // 3.0 对于添加一个节点,删除一个节点,更新一个节点时,都需要在最后SaveFile,我就好几次忘了SaveFile,所以调了老半天。
- // 3.1 总的来说,Tinyxml还是不错的,以后继续学习。
- // 部分功能代码
- // 3.2 对于插入一个节点,首先获取要插入节点的父节点,然后进行插入,最需要注意的是在查询父节点的是时候,必须对应同一个文本对象来操作。有可能在两个函数中同时打开了同一个xml文档,虽然名字一样,但是不是同一个xmldocument对象,所以操作会失败。
- // 最后要保存。
- #include "XmlTest.h"
- #define MAX_NUM 256
- /************************************************************************/
- /* 创建一个xml文档 */
- /************************************************************************/
- void createXml(const char * ccXmlName)
- {
- //创建一个XML的文档对象。
- TiXmlDocument *myDocument = new TiXmlDocument();
- TiXmlDeclaration* decl = new TiXmlDeclaration("1.0","gb2312","yes");
- myDocument->LinkEndChild(decl);
- //创建一个根元素并连接。
- TiXmlElement *RootElement = new TiXmlElement("Persons");
- myDocument->LinkEndChild(RootElement);
- for(int i=; i<;i++)
- {
- //创建一个Person元素并连接。
- TiXmlElement *PersonElement = new TiXmlElement("Person");
- RootElement->LinkEndChild(PersonElement);
- //设置Person元素的属性。
- PersonElement->SetAttribute("ID", i);
- //创建name元素、age元素并连接。
- TiXmlElement *NameElement = new TiXmlElement("name");
- TiXmlElement *AgeElement = new TiXmlElement("age");
- PersonElement->LinkEndChild(NameElement);
- PersonElement->LinkEndChild(AgeElement);
- //设置name元素和age元素的内容并连接。
- TiXmlText *NameContent = new TiXmlText("周星星");
- TiXmlText *AgeContent = new TiXmlText("");
- NameElement->LinkEndChild(NameContent);
- AgeElement->LinkEndChild(AgeContent);
- }
- //保存到文件
- myDocument->SaveFile(ccXmlName);
- }
- /************************************************************************/
- /* 遍历一个xml文档 */
- /************************************************************************/
- void readXml(const char * ccXmlName)
- {
- //创建一个XML的文档对象。
- TiXmlDocument *myDocument = new TiXmlDocument(ccXmlName);
- myDocument->LoadFile();
- //获得xml的头,即声明部分
- TiXmlDeclaration* decl = myDocument->FirstChild()->ToDeclaration();
- cout << "xml文件的版本是:" << decl->Version() << endl;
- cout << "xml的编码格式是:" << decl->Encoding() << endl;
- //获得根元素
- TiXmlElement *RootElement = myDocument->RootElement();
- //输出根元素名称
- cout << RootElement->Value() << endl;
- TiXmlNode* pNode = NULL;
- string msg = "";
- for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())
- {
- msg += dumpNode(pNode,);
- }
- cout << msg << endl;
- }
- /************************************************************************/
- /*描述:遍历一个元素
- 时间:2012-9-18
- 参数说明:pNode节点,flag 节点嵌套层数
- /************************************************************************/
- string dumpNode(TiXmlNode * pNode,int flag)
- {
- string msg = "";
- if(pNode == NULL)
- {
- return "";
- }
- TiXmlText * pText = NULL;
- TiXmlNode * pChildNode = NULL;
- int t = pNode->Type();
- switch(t)
- {
- //节点类型是text节点
- case TiXmlText::TINYXML_TEXT:
- { pText = pNode->ToText();
- string text = pText->Value();
- if(!text.empty())
- {
- msg = msg + "="+ text;
- }
- break;
- }
- //节点类型是Element
- case TiXmlText::TINYXML_ELEMENT:
- {
- msg = msg + "\r\n";
- int num = flag;
- while(num >= )
- {
- msg = msg + " ";
- num--;
- }
- msg = msg + pNode->Value();
- //输出属性
- TiXmlElement * pElement = pNode->ToElement();
- TiXmlAttribute * pAttr = pElement->FirstAttribute();
- TiXmlAttribute * pNextAttr =NULL;
- string tmpAttrMsg = "[";
- //if(pAttr != NULL && !(string(pAttr->Name())).compare("name") && !(string(pAttr->Value())).compare("IDH_CFG_USB"))
- if(pAttr != NULL )
- {
- string tmpAttrVal = "";
- string tmpAttrName = "";
- do
- {
- tmpAttrVal = pAttr->Value();
- tmpAttrName = pAttr->Name();
- tmpAttrMsg += tmpAttrName + "=" +tmpAttrVal + ","; //各个属性之间用逗号分隔
- }while(pAttr = pAttr->Next());
- /* 去掉最后的',' */
- tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_last_of(","));
- //同上 tmpAttrMsg = tmpAttrMsg.substr(0,tmpAttrMsg.find_last_of(","));
- }
- tmpAttrMsg += "]";
- msg += tmpAttrMsg;
- break;
- }
- case TiXmlText::TINYXML_DOCUMENT:
- case TiXmlText::TINYXML_COMMENT:
- case TiXmlText::TINYXML_UNKNOWN:
- case TiXmlText::TINYXML_DECLARATION:
- case TiXmlText::TINYXML_TYPECOUNT:
- {
- ;//Nothing to do
- }
- }
- //循环访问它的每一个元素
- for(pChildNode=pNode->FirstChild();pChildNode!=;pChildNode = pChildNode->NextSibling())
- {
- msg = msg + dumpNode(pChildNode,flag+);
- }
- return msg;
- }
- /************************************************************************/
- /* 查询出唯一节点 */
- /* 参数说明:
- string nodeName 节点名
- string nodeAttrName 节点的属性
- string nodeAttrValue 节点属性的值
- /************************************************************************/
- TiXmlNode * SelectSingleNode(const char * cXmlName,string nodeName,string nodeAttrName,string nodeAttrValue)
- {
- //加载一个XML的文档对象。
- TiXmlDocument *xmlDoc = new TiXmlDocument(cXmlName);
- if(!xmlDoc->LoadFile()) //是tinyXml会自动处理文档的BOM
- {
- return NULL;
- }
- if(xmlDoc == NULL)
- {
- return NULL;
- }
- //获得根元素
- TiXmlElement *RootElement = xmlDoc->RootElement();
- if(RootElement == NULL)
- {
- cout << "解析错误,无法获取根元素" << endl;
- return NULL;
- }
- TiXmlNode * pNode = NULL;
- TiXmlNode * pSelectNode = NULL;
- string msg = "";
- for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())
- {
- pSelectNode = selectChildNode(pNode,nodeName,nodeAttrName,nodeAttrValue);
- if(pSelectNode)
- {
- break;
- }
- }
- if(pSelectNode)
- {
- cout << "解析成功" << endl;
- cout << "[节点名]=" << pSelectNode->Value() << endl;
- return pSelectNode;
- }
- else
- {
- cout << "解析错误,无法获取节点" << endl;
- return NULL;
- }
- }
- TiXmlNode * SelectSingleNodeByRootEle(TiXmlElement* RootElement,string nodeName,string nodeAttrName,string nodeAttrValue)
- {
- //加载一个XML的文档对象。
- // TiXmlDocument *xmlDoc = new TiXmlDocument(cXmlName);
- // if(!xmlDoc->LoadFile()) //是tinyXml会自动处理文档的BOM
- // {
- // return NULL;
- // }
- //
- //
- // if(xmlDoc == NULL)
- // {
- // return NULL;
- // }
- //获得根元素
- //TiXmlElement *RootElement = xmlDoc->RootElement();
- if(RootElement == NULL)
- {
- cout << "解析错误,无法获取根元素" << endl;
- return NULL;
- }
- TiXmlNode * pNode = NULL;
- TiXmlNode * pSelectNode = NULL;
- string msg = "";
- for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())
- {
- pSelectNode = selectChildNode(pNode,nodeName,nodeAttrName,nodeAttrValue);
- if(pSelectNode)
- {
- break;
- }
- }
- if(pSelectNode)
- {
- //cout << "解析成功" << endl;
- //cout << pSelectNode->Value() << endl;
- return pSelectNode;
- }
- else
- {
- cout << "解析错误,无法获取节点" << endl;
- return NULL;
- }
- }
- /************************************************************************/
- /*
- 根据父节点循环遍历查找子节点
- 参数说明
- noteName 节点名
- noteAttrName 属性名
- noteAttrValue 属性值
- /************************************************************************/
- TiXmlNode * selectChildNode(TiXmlNode * pNode,string nodeName,string nodeAttrName,string nodeAttrValue)
- {
- if(pNode == NULL)
- {
- return NULL;
- }
- TiXmlNode * pSelectedNode = NULL;
- TiXmlNode * pChildNode = NULL;
- int t = pNode->Type();
- switch (t)
- {
- case TiXmlText::TINYXML_DOCUMENT:
- case TiXmlText::TINYXML_DECLARATION:
- case TiXmlText::TINYXML_TEXT:
- case TiXmlText::TINYXML_UNKNOWN:
- case TiXmlText::TINYXML_COMMENT:
- break;
- case TiXmlText::TINYXML_ELEMENT:
- if(pNode->Value() == nodeName)
- {
- //cout << pNode->Value() << endl;
- if(!nodeAttrName.empty() && !nodeAttrValue.empty())
- {
- TiXmlElement * pElement = pNode->ToElement();
- TiXmlAttribute * pAttr = pElement->FirstAttribute();
- TiXmlAttribute * pNextAttr =NULL;
- if(pAttr != NULL)
- {
- do
- {
- if(pAttr->Name()==nodeAttrName&&pAttr->Value()== nodeAttrValue)
- {
- //cout << pAttr->Value() << endl;
- return pNode;
- }
- }while(pAttr = pAttr->Next());
- }
- }
- else
- {
- return pNode;
- }
- }
- else
- {
- //循环访问它的每一个元素
- for(pChildNode=pNode->FirstChild();
- pChildNode!=;
- pChildNode = pChildNode->NextSibling())
- {
- pSelectedNode = selectChildNode(
- pChildNode,
- nodeName,
- nodeAttrName,
- nodeAttrValue);
- if(pSelectedNode)
- {
- return pSelectedNode;
- }
- }
- }
- default:break;
- }
- return NULL;
- }
- /************************************************************************/
- /* 普通插入一个节点,还不完善。 */
- /************************************************************************/
- bool insert(const char * ccXmlName)
- {
- //加载一个XML的文档对象。
- TiXmlDocument *myDocument = new TiXmlDocument(ccXmlName);
- myDocument->LoadFile();
- if(myDocument == NULL)
- {
- return false;
- }
- //获得xml的头,即声明部分
- TiXmlDeclaration* decl = myDocument->FirstChild()->ToDeclaration();
- if(decl != NULL)
- {
- cout << "xml文件的版本是:" << decl->Version() << endl;
- cout << "xml的编码格式是:" << decl->Encoding() << endl;
- }
- //获得根元素
- TiXmlElement *RootElement = myDocument->RootElement();
- if(RootElement != NULL)
- {
- //创建一个Person元素并连接。
- TiXmlElement *PersonElement = new TiXmlElement("Person");
- PersonElement->SetAttribute("Id",);
- RootElement->LinkEndChild(PersonElement);
- TiXmlText *textElement = new TiXmlText("Jam");
- PersonElement->LinkEndChild(textElement);
- //增加一个team元素
- TiXmlElement *TeamElement = new TiXmlElement("team");
- TeamElement->SetAttribute("TID","");
- RootElement->LinkEndChild(TeamElement);
- //增加team的子节点name
- TiXmlElement *teamName = new TiXmlElement("name");
- TiXmlText *nameText = new TiXmlText("workgroup");
- teamName->LinkEndChild(nameText);
- TeamElement->LinkEndChild(teamName);
- //增加team的子节点type
- TiXmlElement *teamType = new TiXmlElement("type");
- TiXmlText *typeText = new TiXmlText("SI");
- teamType->LinkEndChild(typeText);
- TeamElement->LinkEndChild(teamType);
- myDocument->SaveFile("Person.xml");
- //输出根元素名称
- cout << RootElement->Value() << endl;
- return true;
- }
- return false;
- }
- /************************************************************************/
- /* 获取一个节点的属性 */
- /************************************************************************/
- string getAttribute(TiXmlNode * pNode)
- {
- if(pNode == NULL) return "";
- //输出属性
- string msg = "";
- TiXmlElement * pElement = pNode->ToElement();
- TiXmlAttribute * pAttr = pElement->FirstAttribute();
- TiXmlAttribute * pNextAttr =NULL;
- string tmpAttrMsg = "";
- if(pAttr != NULL)
- {
- string tmpAttrVal = "";
- string tmpAttrName = "";
- do
- {
- tmpAttrVal = pAttr->Value();
- tmpAttrName = pAttr->Name();
- tmpAttrMsg += "[" + tmpAttrName + "]=" + tmpAttrVal+"\n"; //各个属性之间用逗号分隔
- }while(pAttr = pAttr->Next());
- //tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_last_of(","));
- }
- //tmpAttrMsg += "]";
- msg += tmpAttrMsg;
- return msg;
- }
- /************************************************************************/
- /* 在指定位置插入一个元素 */
- /************************************************************************/
- bool insertAElement(const char * cXmlName, TiXmlElement * pElement)
- {
- //加载一个XML的文档对象。
- TiXmlDocument *xmlDoc = new TiXmlDocument(cXmlName);
- xmlDoc->LoadFile();
- if(xmlDoc == NULL)
- {
- return false;
- }
- //获得xml的头,即声明部分
- TiXmlDeclaration* decl = xmlDoc->FirstChild()->ToDeclaration();
- if(decl != NULL)
- {
- cout << "xml文件的版本是:" << decl->Version() << endl;
- cout << "xml的编码格式是:" << decl->Encoding() << endl;
- }
- //获得根元素
- TiXmlElement *RootElement = xmlDoc->RootElement();
- if(RootElement != NULL)
- {
- TiXmlNode * pNode = SelectSingleNode(cXmlName,"name","length","");
- if(pNode == NULL)
- {
- return false;
- }
- //创建一个Person元素并连接。
- TiXmlElement *pNewElement = new TiXmlElement("Person");
- if(pNewElement == NULL)
- {
- return false;
- }
- pNewElement->SetAttribute("Id","");
- TiXmlText *textElement = new TiXmlText("gbnn");
- if(textElement == NULL)
- {
- return false;
- }
- pNewElement->LinkEndChild(textElement);
- TiXmlNode * pRet = pNode->InsertBeforeChild(pNode->LastChild(),*pNewElement);
- //TiXmlNode * pRet = pNode->LinkEndChild(pNewElement);
- xmlDoc->Print();
- bool b = xmlDoc->SaveFile();
- if(b)
- {
- cout << "添加成功" << endl;
- return b;
- }
- else
- {
- cout << "添加失败" << endl;
- return false;
- }
- }
- else
- {
- return false;
- }
- }
- //const char * cXmlName,string strNodeName,string strNodeAttrName,string strNdeAttrValue,string strPath
- /*!
- * \Function: 修改一个唯一节点中第二、三属性的值为一子符串
- *
- * \param cXmlName xml文件名
- * \param strNodeName 指定的节点名。
- * \param strNodeAttrName 指定的节点名所在节点中第一属性名。
- * \param strNdeAttrValue 指定的节点名所在节点中第一属性值。
- * \param strPath 字符串。为当前路径名的上一级目录的字符串
- * \return 是否成功。true为成功,false表示失败。
- */
- bool ModifySingleNode(const char * cXmlName,string strNodeName,string strNodeAttrName,string strNdeAttrValue,string strPath)
- {
- if (strNodeName.empty() || strNodeAttrName.empty() || strNdeAttrValue.empty() ||strPath.empty())
- {
- return false;
- }
- // 定义一个TiXmlDocument类指针
- TiXmlDocument *pDoc = new TiXmlDocument();
- if (NULL==pDoc)
- {
- return false;
- }
- pDoc->LoadFile(cXmlName);
- TiXmlElement* pRootElement = pDoc->RootElement();
- TiXmlNode * pNode = SelectSingleNodeByRootEle(pRootElement,strNodeName,strNodeAttrName,strNdeAttrValue);
- if (NULL == pNode)
- {
- return false;
- }
- //输出属性
- TiXmlElement * pElement = pNode->ToElement();
- TiXmlAttribute * pAttr = pElement->FirstAttribute();
- TiXmlAttribute * pNextAttr =NULL;
- if(pAttr != NULL)
- {
- string tmpAttrVal = "";
- string tmpAttrName = "";
- do
- {
- tmpAttrVal = pAttr->Value();
- tmpAttrName = pAttr->Name();
- //节点中第一个属性对跳过
- if (tmpAttrName == strNodeAttrName && tmpAttrVal == strNdeAttrValue)
- {
- continue;
- }
- //修改第二和第三个属性对
- if ("href" == tmpAttrName)
- {
- pAttr->SetValue(strPath.c_str());
- }
- if ("test" == tmpAttrName)
- {
- pAttr->SetValue(strPath.c_str());
- }
- }while(pAttr = pAttr->Next());
- }
- pDoc->SaveFile("hhhhhhhhhhhhh.xml");
- return true;
- }
- void ShowSingleNode(const char * cXmlName,string strNodeName,string strNodeAttrName,string strNdeAttrValue)
- {
- TiXmlNode * pNode = SelectSingleNode(cXmlName,strNodeName,strNodeAttrName,strNdeAttrValue);
- if (NULL == pNode)
- {
- return;
- }
- string strTem = getAttribute(pNode);
- cout << strTem.c_str() << endl;
- }
- string PathOpt()
- {
- char cStr[MAX_NUM];
- GetCurrentDirectory(MAX_NUM,cStr);
- string str = cStr;
- //取当前路径的上一目录所在路径
- size_t pos = str.find_last_of("\\");
- str.erase(str.begin()+pos,str.end());
- return str;
- }
- int main()
- {
- const char * cXmlName = "files.xml";
- string strPath;
- //createXml(ccXmlName);
- //readXml(cXmlName);
- //insert(ccXmlName);
- //readXml(ccXmlName);
- ShowSingleNode(cXmlName,"Document","title","About VMware Player Help");
- strPath = PathOpt();
- bool ret = ModifySingleNode(cXmlName,"Document","title","About VMware Player Help",strPath);
- if (ret)
- {
- cout << "OK" << endl;
- }
- else
- {
- cout << "false" << endl;
- }
- ShowSingleNode("hhhhhhhhhhhhh.xml","Document","title","About VMware Player Help");
- return ;
- }
自己改写的代码
- TiXmlElement* m_pCurElement; ///< 当前元素
- /** @brief 设置当前位置到特定的节点 */
- bool SetToSelectNode(TiXmlNode * pNode, const std::string& szName, const std::string& szAttribute, const std::string& szValue)
- {
- if(pNode == NULL)
- {
- return false;
- }
- if(pNode->Value() == szName)
- {
- //找到了相同的节点名称
- if(!szAttribute.empty() && !szValue.empty())
- {
- // 循环获取元素的每一个属性
- // a 得到元素的第一个属性
- // b do——while循环获取每一个属性和值。
- TiXmlElement * pElement = pNode->ToElement();
- TiXmlAttribute * pAttr = pElement->FirstAttribute();
- TiXmlAttribute * pNextAttr =NULL;
- if(pAttr != NULL)
- {
- do
- {
- if(pAttr->Name()==szAttribute&&pAttr->Value()== szValue)
- {
- m_pCurElement = pElement;
- return true;
- }
- }while(pAttr = pAttr->Next());
- }
- }
- else
- {
- //如果 nodeAttrName 或者 nodeAttrValue 不需要找,则直接选取此点。
- m_pCurElement = pNode->ToElement();
- return true;
- }
- }
- else
- {
- //循环访问它的每一个元素
- for(TiXmlNode *pChildNode =pNode->FirstChild(); pChildNode!=; pChildNode = pChildNode->NextSibling())
- {
- if(SetToSelectNode(pChildNode,szName, szAttribute,szValue))
- {
- return true;
- }
- }
- }
- return false;
- }
TinyXml节点查找及修改的更多相关文章
- Dom4j 操作, 节点查找 添加 删除 修改 。。。xPath
转: Dom4j 操作, 节点查找 添加 删除 修改 ...xPath 2013年11月28日 10:48:59 今晚打酱油8 阅读数:8506更多 个人分类: JavaWeb 版权声明:本文为博 ...
- jackson中JSON字符串节点遍历和修改
有些场景下,在实现一些基础服务和拦截器的时候,我们可能需要在不知道JSON字符串所属对象类型的情况下,对JSON字符串中的某些属性进行遍历和修改,比如,设置或查询一些报文头字段. 在jackson中, ...
- JQuery学习笔记(3)——节点操作 节点查找
插入节点 内部插入 所谓的内部插入,就是指在节点里面的插入,而外部插入,则是在节点外面插入. append() prepend() appendTo() prependTo() append和prep ...
- iOS --SQL的增加、删除、查找、修改
iOS对于数据库的操作:增加.删除.查找.修改 首先需要创建一个数据库:本程序的数据库是在火狐浏览器里的插件里写的微量型数据库 火狐找查找SQLite Manager的步骤: 第一步:在工具栏找到附加 ...
- jQuery的父,子,兄弟节点查找方法
以下罗列一下jQery下节点查找的方法: jQuery.parent(expr) 找父亲节点.能够传入expr进行过滤,比方$("span").parent()或者$(" ...
- JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删改查),事件
JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删 ...
- JS操作DOM节点查找
JS中常用的DOM操作事件,包括有节点查找,键盘鼠标事件等等,本文内容介绍DOM的节点查找. <script> window.onload = function(){ //children ...
- 用find命令查找最近修改过的文件
Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...
- Linux系统下查找最近修改过的文件
Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...
随机推荐
- jmeter 基础功能详解
jmeter 基础功能详解 thread group:包含一组线程,每个线程独立地执行测试计划. sampler:采样器,有多种不同的sample实现,用来发起各种请求,如http请求,jdbc请求, ...
- Genymotion虚拟镜像下载慢或者失败的解决办法
Genymotion虚拟镜像下载慢或者失败的解决办法 http://files2.genymotion.com/dists/8.0.0/ova/genymotion_vbox86p_8.0_18061 ...
- dedecms开启报错
php.ini里面设置display_errors = On 开启错误提示,error_reporting = E_ALL & ~E_NOTICE 设置错误等级.也可以在php文件中ini_s ...
- 阿里云云主机swap功能设置实战案例
阿里云云主机swap功能设置实战案例 阿里云提供的云服务器(Elastic Compute Service,简称 ECS),是云主机的一种,当前采用的虚拟化驱动是Xen(这一点可以通过bios ven ...
- Maven(一)如何用Eclipse创建一个Maven项目
1.什么是Maven Apache Maven 是一个项目管理和整合工具.基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建.报告和文档. Maven工程结构和 ...
- [转] Python的import初探
转载自:http://www.lingcc.com/2011/12/15/11902/#sec-1 日常使用python编程时,为了用某个代码模块,通常需要在代码中先import相应的module.那 ...
- 浏览器内核、排版引擎、js引擎
[定义] 浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“渲染引擎”,不过我们一般习惯将之称为“浏览器内核”.负责对网页语法的解释(如标准通用标记语 言下的一个应用HT ...
- ELK之logstash6.5
首先安装,这里采用rpm安装: # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 创建repo文件: [root@no ...
- html模板生成静态页面及模板分页处理
它只让你修改页面的某一部分,当然这"某一部分"是由你来确定的.美工先做好一个页面,然后我们把这个页面当作模板(要注意的是这个模板就没必要使用EditRegion3这样的代码了,这种 ...
- Python3基础 hasattr 测试类是否有指定的类属性
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...