XML 语法纲要
1、忽略空白
2、注释: <!-- -->
3、指令: <? ?>
4、特殊字符: < > ' " & 替代: < > ' " &
5、二进制数据: <![CDATA [...]]>
6、区分大小写
7、标记不能交叠
8、单标记, 也就是空元素, 如: <node/>, 只用属性记录数据
9、属性值在引号内
10、xml 中的元素与属性的名字, 必须以字母或 _ 开头, 后面可以是字母、数字或 _ - : . 的组合, 但不能使用 xml 开始.
11、文件头包含版本与字符编码,
如: <?xml version="1.0" encoding="UTF-8"?>、<?xml version="1.0" encoding="gb2312"?>
2、注释: <!-- -->
3、指令: <? ?>
4、特殊字符: < > ' " & 替代: < > ' " &
5、二进制数据: <![CDATA [...]]>
6、区分大小写
7、标记不能交叠
8、单标记, 也就是空元素, 如: <node/>, 只用属性记录数据
9、属性值在引号内
10、xml 中的元素与属性的名字, 必须以字母或 _ 开头, 后面可以是字母、数字或 _ - : . 的组合, 但不能使用 xml 开始.
11、文件头包含版本与字符编码,
如: <?xml version="1.0" encoding="UTF-8"?>、<?xml version="1.0" encoding="gb2312"?>
1、TXMLDocument 适用于内存中操作和建立新的 xml
2、一个 TXMLDocument 文档其实就是一个节点集合
3、每个节点包括名称、文本内容、属性集合、子节点集合
4、可以按位置或名称访问节点
5、每一个节点都是一个 IXMLNode 对象
6、每一个节点下包含的节点集合是一个 IXMLNodeList 对象, 用节点的 ChildNodes 属性获取
7、根节点 XMLDocument1.DocumentElement 也是一个 IXMLNode 对象
8、XMLDocument1.DocumentElement.ChildNodes 是一个 IXMLNodeList 对象, 访问一般从这里开始
9、可以把属性认为成横向的节点
2、一个 TXMLDocument 文档其实就是一个节点集合
3、每个节点包括名称、文本内容、属性集合、子节点集合
4、可以按位置或名称访问节点
5、每一个节点都是一个 IXMLNode 对象
6、每一个节点下包含的节点集合是一个 IXMLNodeList 对象, 用节点的 ChildNodes 属性获取
7、根节点 XMLDocument1.DocumentElement 也是一个 IXMLNode 对象
8、XMLDocument1.DocumentElement.ChildNodes 是一个 IXMLNodeList 对象, 访问一般从这里开始
9、可以把属性认为成横向的节点
读XML节点(已经优化过的版本,可以直接COPY使用)
{-------------------------------------------------------------------------------
Fun/Pro: GetXMLNodeSpecialvalue
@Date: 2004.12.11
@Param: xmlFile xml文件
@Param: xmlnodepath 节点
@Param: xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。
@Param: XMLSpecialName 要查找的节点中属性名
@Param: XMLSpecialvalue 要查找的节点中某属性对应的值
@Param: dep 节点的参数的分隔符,默认为.
@Return: 某属性的值
-------------------------------------------------------------------------------}
function GetXMLNodeSpecialvalue(strEntityEnginefile:String; XMLNodePath:String;
const XMLAttrName:String=''; const XMLSpecialName:String=''; const XMLSpecialvalue:String=''; const dep:Char ='.'):String;
var
xmlDocument :IXMLDocument;
node :IXMLNode;
xmlnodeList :TStrings;
i :Integer;
urlcount :Integer;
begin
//xml节点路径
xmlnodeList:=TStringList.Create;
xmlnodeList.Delimiter:=dep;
xmlnodeList.DelimitedText:=xmlnodepath;
urlcount:=xmlnodeList.Count;
//xml对象
xmlDocument :=TXMLDocument.Create(nil);
xmlDocument.LoadFromFile(strEntityEngineFile);
xmlDocument.Active:=true;
try
node:= xmlDocument.DocumentElement;
if(node.NodeName = xmlnodeList[0]) then begin
//扫描节点
for i := 1 to urlcount-1 do begin
if(node<>nil) then
begin
node := getnodefromIXMLNodeList(node.ChildNodes,xmlnodeList[i]);
end
else Break;
end;
if(node=nil)then begin
result:='';
end else begin
//判断是取属性还是取节点内容
if(Trim(xmlattrname)='') then
result:=node.Text
else
begin
result := node.AttributeNodes.Nodes[XMLSpecialName].Nodevalue; //这里不想再声明一个临时变量了,就用result来比较,可能有隐患。
while ((result <> XMLSpecialvalue)) do
begin
node := node.NextSibling;
while (node.NodeName = '#comment') do
begin
node:= node.NextSibling;
end;
result := node.AttributeNodes.Nodes[XMLSpecialName].Nodevalue;
end;
result:=node.AttributeNodes.Nodes[XMLAttrName].Nodevalue;
end;
end;
end else begin
result:='';
end;
except
result:='error';
end;
xmlDocument.Active:=false;
end;
写函数 (已经优化过的版本,可以直接COPY使用)
{-------------------------------------------------------------------------------
Fun/Pro: SetXMLNodeSpecialvalue
@Date: 2004.12.11
@Param: xmlFile xml文件
@Param: xmlnodepath 节点
@Param: xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。
@Param: XMLSpecialName 要查找的节点中属性名
@Param: XMLSpecialvalue 要查找的节点中某属性对应的值
@Param: dep 节点的参数的分隔符,默认为.
@Return: 操作成功与否
-------------------------------------------------------------------------------}
function SetXMLNodeSpecialvalue(strEntityEnginefile:String; xmlNodePath:String;
const xmlattrname:String=''; const value:String=''; const XMLSpecialName:String=''; const XMLSpecialvalue:String=''; const dep:Char ='.'):boolean;
var
xmlDocument :IXMLDocument;
node :IXMLNode;
xmlnodeList :TStrings;
i :Integer;
urlcount :Integer;
CMPvalue :String;
begin
//xml节点路径
xmlnodeList:=TStringList.Create;
xmlnodeList.Delimiter:=dep;
xmlnodeList.DelimitedText:=xmlnodepath;
urlcount:=xmlnodeList.Count;
//xml对象
xmlDocument :=TXMLDocument.Create(nil);
xmlDocument.LoadFromFile(strEntityEngineFile);
xmlDocument.Active:=true;
try
node:= xmlDocument.DocumentElement;
if(node.NodeName = xmlnodeList[0]) then begin
//扫描节点
for i := 1 to urlcount-1 do begin
if(node<>nil) then
node := getnodefromIXMLNodeList(node.ChildNodes,xmlnodeList[i])
else Break;
end;
if(node <> nil)then begin
{if(Trim(xmlattrname)='') then
node.Text:=value
else
node.AttributeNodes.Nodes[xmlattrname].Nodevalue:=value;
}
if (Trim(XMLAttrName)='') then
node.Text := value
else
begin
CMPvalue := node.AttributeNodes.Nodes[XMLSpecialName].Nodevalue;
while (CMPvalue <> XMLSpecialvalue) do
begin
node := node.NextSibling;
while (node.NodeName = '#comment') do
begin
node:= node.NextSibling;
end;
CMPvalue := node.AttributeNodes.Nodes[XMLSpecialName].Nodevalue;
end;
node.AttributeNodes.Nodes[XMLAttrName].Nodevalue:=value;
end;
xmlDocument.SaveToFile(strEntityEngineFile);
end;
end;
result:=true;
except
result:=false;
end;
xmlDocument.Active:=false;
end;
网上很多用户反映getnodefromIXMLNodeList这个函数没有声明,现将该函数贴出来。做为上面帖子的补充
function getnodefromIXMLNodeList(childnodes:IXMLNodeList;nodename:String):IXMLNode;
var
i: Integer;
begin
for i :=1 to childnodes.Count do begin
if(childnodes.Get(i-1).NodeName = nodename) then begin
result:= childnodes[i-1];
exit;
end;
end;
end;
{-------------------------------------------------------------------------------
Fun/Pro: GetXMLNodeSpecialvalue
@Date: 2004.12.11
@Param: xmlFile xml文件
@Param: xmlnodepath 节点
@Param: xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。
@Param: XMLSpecialName 要查找的节点中属性名
@Param: XMLSpecialvalue 要查找的节点中某属性对应的值
@Param: dep 节点的参数的分隔符,默认为.
@Return: 某属性的值
-------------------------------------------------------------------------------}
function GetXMLNodeSpecialvalue(strEntityEnginefile:String; XMLNodePath:String;
const XMLAttrName:String=''; const XMLSpecialName:String=''; const XMLSpecialvalue:String=''; const dep:Char ='.'):String;
var
xmlDocument :IXMLDocument;
node :IXMLNode;
xmlnodeList :TStrings;
i :Integer;
urlcount :Integer;
begin
//xml节点路径
xmlnodeList:=TStringList.Create;
xmlnodeList.Delimiter:=dep;
xmlnodeList.DelimitedText:=xmlnodepath;
urlcount:=xmlnodeList.Count;
//xml对象
xmlDocument :=TXMLDocument.Create(nil);
xmlDocument.LoadFromFile(strEntityEngineFile);
xmlDocument.Active:=true;
try
node:= xmlDocument.DocumentElement;
if(node.NodeName = xmlnodeList[0]) then begin
//扫描节点
for i := 1 to urlcount-1 do begin
if(node<>nil) then
begin
node := getnodefromIXMLNodeList(node.ChildNodes,xmlnodeList[i]);
end
else Break;
end;
if(node=nil)then begin
result:='';
end else begin
//判断是取属性还是取节点内容
if(Trim(xmlattrname)='') then
result:=node.Text
else
begin
result := node.AttributeNodes.Nodes[XMLSpecialName].Nodevalue; //这里不想再声明一个临时变量了,就用result来比较,可能有隐患。
while ((result <> XMLSpecialvalue)) do
begin
node := node.NextSibling;
while (node.NodeName = '#comment') do
begin
node:= node.NextSibling;
end;
result := node.AttributeNodes.Nodes[XMLSpecialName].Nodevalue;
end;
result:=node.AttributeNodes.Nodes[XMLAttrName].Nodevalue;
end;
end;
end else begin
result:='';
end;
except
result:='error';
end;
xmlDocument.Active:=false;
end;
写函数 (已经优化过的版本,可以直接COPY使用)
{-------------------------------------------------------------------------------
Fun/Pro: SetXMLNodeSpecialvalue
@Date: 2004.12.11
@Param: xmlFile xml文件
@Param: xmlnodepath 节点
@Param: xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。
@Param: XMLSpecialName 要查找的节点中属性名
@Param: XMLSpecialvalue 要查找的节点中某属性对应的值
@Param: dep 节点的参数的分隔符,默认为.
@Return: 操作成功与否
-------------------------------------------------------------------------------}
function SetXMLNodeSpecialvalue(strEntityEnginefile:String; xmlNodePath:String;
const xmlattrname:String=''; const value:String=''; const XMLSpecialName:String=''; const XMLSpecialvalue:String=''; const dep:Char ='.'):boolean;
var
xmlDocument :IXMLDocument;
node :IXMLNode;
xmlnodeList :TStrings;
i :Integer;
urlcount :Integer;
CMPvalue :String;
begin
//xml节点路径
xmlnodeList:=TStringList.Create;
xmlnodeList.Delimiter:=dep;
xmlnodeList.DelimitedText:=xmlnodepath;
urlcount:=xmlnodeList.Count;
//xml对象
xmlDocument :=TXMLDocument.Create(nil);
xmlDocument.LoadFromFile(strEntityEngineFile);
xmlDocument.Active:=true;
try
node:= xmlDocument.DocumentElement;
if(node.NodeName = xmlnodeList[0]) then begin
//扫描节点
for i := 1 to urlcount-1 do begin
if(node<>nil) then
node := getnodefromIXMLNodeList(node.ChildNodes,xmlnodeList[i])
else Break;
end;
if(node <> nil)then begin
{if(Trim(xmlattrname)='') then
node.Text:=value
else
node.AttributeNodes.Nodes[xmlattrname].Nodevalue:=value;
}
if (Trim(XMLAttrName)='') then
node.Text := value
else
begin
CMPvalue := node.AttributeNodes.Nodes[XMLSpecialName].Nodevalue;
while (CMPvalue <> XMLSpecialvalue) do
begin
node := node.NextSibling;
while (node.NodeName = '#comment') do
begin
node:= node.NextSibling;
end;
CMPvalue := node.AttributeNodes.Nodes[XMLSpecialName].Nodevalue;
end;
node.AttributeNodes.Nodes[XMLAttrName].Nodevalue:=value;
end;
xmlDocument.SaveToFile(strEntityEngineFile);
end;
end;
result:=true;
except
result:=false;
end;
xmlDocument.Active:=false;
end;
网上很多用户反映getnodefromIXMLNodeList这个函数没有声明,现将该函数贴出来。做为上面帖子的补充
function getnodefromIXMLNodeList(childnodes:IXMLNodeList;nodename:String):IXMLNode;
var
i: Integer;
begin
for i :=1 to childnodes.Count do begin
if(childnodes.Get(i-1).NodeName = nodename) then begin
result:= childnodes[i-1];
exit;
end;
end;
end;