// 取得XML中的一个节点的值.
function getNodeValue(doc,xpath) 
{
	var retval = "";
	var value = doc.selectSingleNode(xpath);
	if (value) retval = value.text;
	return retval;
}

// 取得XML中的一个节点.
function getNode(doc,xpath)
{  
	return doc.selectSingleNode(xpath); 
}
// 取得节点下的子节点个数 
function getNodeslength(doc,xpath)
{//alert("4"+doc.innerHTML);
	try
	{
		var retval = "";
		var value = getNode(doc,xpath);
		if(value)
		{
			retval = value.childNodes.length;
		}
		if(retval==undefined||retval=="")retval=0;
		return retval;
	}
	catch(ex)
	{
		//alert("getNodeslength:"+ex.message)
		retval=0;
	}
}
// 删除XML中的一个节点.不可删除根节点.
function delNode(doc,Obj)
{
	doc.documentElement.removeChild(Obj);
}
// 添加节点,在xpath后添加Obj子节点,xpath必须为根路径后子节点
 function InsertBeforeChild(xpath,Obj)
 {
 Node=this.getNode(xpath.substr(0,xpath.lastIndexOf("/")));
  RefNode=this.getNode(xpath);
 Node.insertBefore(Obj,RefNode);
 }
 
// 在xpath中添加子节点Obj
function InsertChild(doc,xpath,Obj)
{
	//Node=this.getNode(xpath);
	//Node.appendChild(Obj);
	//doc.childNodes.selectSingleNode(xpath).appendChild(Obj);
	//doc.appendChild(Obj);
	//alert(11)
	Node=getNode(doc,xpath);
//	alert(Node.text+"|123");
	//alert(Node.childNodes[3].text+"|1");
	//alert(Node.text+"|"+Node[0].text+"|"+Obj[0].text)
	Node.appendChild(Obj);
}
 
// 在xpath下创建一个<Str></Str>节点．
function CreateNodeS(doc,xpath,Str)
{
	NewNode=doc.createNode(1,Str,"");
	doc.InsertChild(xpath,NewNode);  
}
  
// 在xpath下添加属性名为 name 值为 value 的属性.
 function addAttrib(xpath,name,value)
 {
  Node=this.getNode(xpath); 
  objNewAtt=this.xmlDoc.createAttribute(name);
  objNewAtt.text=value;
  Node.attributes.setNamedItem(objNewAtt);  
 }
 
// 取得节点下的属性 attrib
 function getNodeAttrib(xpath,attrib)
 {
  Node=this.getNode(xpath).attributes;
  var i=0;
  while(Node[i]!=null)
  {
   if(Node[i].name==attrib)return Node[i].text;
   i++;
   }
  return null;
  }
 
// 设置指定节点的值.
 function setAttrib(xpath,attrib,value)
 {
  Node=this.getNode(xpath).attributes;
 var i=0;
 while(Node[i]!=null)
 {
  if(Node[i].name==attrib){   
   Node[i].text=value;
   return true;
   }
  i++;
  }
  return false;
 }
 
// 设置指定节点的属性值.
function setNodeValue(xpath,value)
{
	Node=this.getNode(xpath);
	//alert(Node.xml);
	if(Node.childNodes[1]==null)
	{
		Node.text=value;
		//alert(Node.xml);
		return true;
	}
	else return false;
	//if(Node.childNodes[1]==null)
	//return false;
	// else
	//Node.text=value;
}

// 查找XML中包含Str的所有路径.
// 入口参数: Node   开始的节点
//    xpath  当前节点的路径
//    Str   所要查找的字符串
// 出口参数: n   第n个查找到的节点
//    Result  查找成功的节点数组
// 特别注意:找到的结果是以反向存储在数组中.
// 第一步:如果当前节点下有子节点,那么取出第一个子节点,进入循环.
// 第二步:按XML顺序依次取出子节点
// 第三步:过滤无效子节点.
// 第四步:如果当前子节点属最底层节点,判断当前子节点是否包含了查找的字符串.
// 第五步:否则查找当前子节点的兄弟点.
// 第六步:如果当前子节点是带有孙子的节点,则进入递归.

function findNodes(Node,NodeName,Str,n,Result)
{ 
	//ss=Node.childNodes;
	var i=0;
	var a="";
	while(Node.childNodes[i]!=null)
	{ 
		a=Node.childNodes[i].nodeName;      // XML中的一个多的节点.名为#text,将它删除.
		if(a=="#text"){i++;continue;}
		n=findNodesString(Node.childNodes[i],NodeName,Str,n,Result); // 因为Js不能传地址,那么我们可以将N返回到前面来,这样的结果才是正确的.
		if(Node.childNodes[i].childNodes[1]==null)
		{   
			if(NodeName!=""&&NodeName!=null)
			{
				if(Node.childNodes[i].nodeName!=NodeName)
				{
					i++;
					continue;
				}
			}
			//alert(Node.childNodes[i].text);
			// 如果当前节点下无子节点,那么,查找字符串.对查在成功者,加入 Result
			if((Node.childNodes[i].text).indexOf(Str)!=-1)
			{
				//alert(Node.childNodes[i].text);
				Result[n]=Node.childNodes[i];
				n++;
			}
		}  
		i++;  
	}
	return n;
}
function findNodesLine(Node,NodeName,Str,n,Result)
{ 
	//ss=Node.childNodes;
	var i=0;
	var a="";
	while(Node.childNodes[i]!=null)
	{ 
		a=Node.childNodes[i].nodeName;      // XML中的一个多的节点.名为#text,将它删除.
		if(a=="#text"){i++;continue;}
		n=findNodesLine(Node.childNodes[i],NodeName,Str,n,Result); // 因为Js不能传地址,那么我们可以将N返回到前面来,这样的结果才是正确的.
		if(Node.childNodes[i].childNodes[1]==null)
		{   
			if(NodeName!=""&&NodeName!=null)
			{
				if(Node.childNodes[i].nodeName!=NodeName)
				{
					i++;
					continue;
				}
			}
			// 如果当前节点下无子节点,那么,查找字符串.对查在成功者,加入 Result
			if((Node.childNodes[i].text).indexOf(Str)!=-1)
			{
				Result[n]=Node;
				//Result[n]=Node.childNodes[i];
				n++;
			}
		}  
		i++;  
	}
	return n;
}

