研究心得------->我写的一个XML解析类 (100分)

  • 主题发起人 主题发起人 wr960204
  • 开始时间 开始时间
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
这个的效率还是很高的,只比MS封装的XML COM组件效率低一点。
测试10K大的文件,循环1000次只慢0.25秒
{***************************************************************}
{ }
{ }
{ }
{ }
{ }
{ }
{ 封装的XMLTree类、节点属性类,节点类 }
{ }
{ wr960204(王锐) 2003/12/10 }
{ QQ:42088303 }
{ }
{***************************************************************}
unit UnitXMLTree;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TCustomXMLTree = class;
TXMLNode = class;

TNodeAttrib = class
private
AttribName: WideString;
AttribValue: Variant;
end;

TXMLNode = class(TPersistent)
private
FXMLNodes: TList;
FAttribs: TList;
FParentNode: TXMLNode;
FNodeName: WideString;
FText: WideString;
FHeadStr: string;

procedure ClearAttrib;

function GetAttribName(Index: Integer): WideString;
function GetXMLNodes(Index: Integer): TXMLNode;
function GetAttribCount: Integer;
function GetAttrib(AttribName: string): Variant;
procedure SetAttrib(AttribName: string; const Value: Variant);
function GetAttribByIndex(Index: Integer): Variant;
procedure SetAttribByIndex(Index: Integer; const Value: Variant);
function GetNodeCount: Integer;
public
procedure Delete(Index: Integer); virtual;
procedure DeleteMe(); //把自身从父结点中删除
procedure Append(const AName: string); virtual;
procedure Insert(Index: Integer; const AName: string); virtual;
procedure Clear;

function SaveToText(const ASaveSelf: Boolean = True): WideString; virtual;

constructor Create(AOwner: TXMLNode);
destructor Destroy; override;

property NodeName: WideString read FNodeName write FNodeName;
property Text: WideString read FText write FText;

property XMLNodes[Index: Integer]: TXMLNode read GetXMLNodes;
property AttribCount: Integer read GetAttribCount;
property Attribs[AttribName: string]: Variant read GetAttrib write
SetAttrib;
property AttribIndexOf[Index: Integer]: Variant read GetAttribByIndex write
SetAttribByIndex;
property NodeCount: Integer read GetNodeCount;
end;

TCustomXMLTree = class(TComponent)
private
FVersion: string;
FEncoding: string;
FUpDating: Boolean;
FXMLText: TStringList;
FRootNode: TXMLNode;
function GetXMLText: TStringList;
procedure SetVersion(const Value: string);
procedure SetEncoding(const Value: string);
protected
procedure CreateTree; virtual; //把文本解析成树
procedure CreateText; virtual; //把树解析成文本
procedure XMLTextChange(Sender: TObject); virtual;
procedure SetXMLText(const Value: TStringList); virtual;
public

property XMLText: TStringList read GetXMLText write SetXMLText;
property RootNode: TXMLNode read FRootNode;
property Version: string read FVersion write SetVersion;
property Encoding: string read FEncoding write SetEncoding;

constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

end;

implementation

uses
UnitAssistant;

{ TCustomXMLTree }

constructor TCustomXMLTree.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FUpDating := False;
FXMLText := TStringList.Create;
FXMLText.OnChange := XMLTextChange;
FRootNode := TXMLNode.Create(nil);
end;

destructor TCustomXMLTree.Destroy;
begin
FRootNode.Free;
FXMLText.Free;
inherited Destroy;
end;

procedure TCustomXMLTree.CreateText;
var
XMLInfo : string;
begin
XMLInfo := format('<?xml version="%s" encoding="%s"?>',
[FVersion, FEncoding]);
FUpDating := True;
FXMLText.Text := FRootNode.SaveToText(False);
FXMLText.Insert(0, XMLInfo);
FUpDating := False;
end;

procedure TCustomXMLTree.CreateTree;
var
XMLParser : TXMLParser;
begin
FRootNode.Clear;
XMLParser := TXMLParser.Create(FRootNode);
try
XMLParser.Text := FXMLText.Text;
while XMLParser.NextToken.TokenType <> tkEOF do
begin
end;
FVersion := XMLParser.Version;
FEncoding := XMLParser.Encoding;
finally
XMLParser.Free;
end;
end;

function TCustomXMLTree.GetXMLText: TStringList;
begin
if FXMLText.Text <> '' then
begin
CreateText;
end;
Result := FXMLText;
end;

procedure TCustomXMLTree.SetXMLText(const Value: TStringList);
begin
if (Value <> nil) and (Value.Text <> FXMLText.Text) then
begin
FXMLText.Assign(Value);
CreateTree;
end;
end;

procedure TCustomXMLTree.XMLTextChange(Sender: TObject);
begin
if FUpDating then
Exit;
CreateTree;
end;

procedure TCustomXMLTree.SetVersion(const Value: string);
begin
FVersion := Value;
end;

procedure TCustomXMLTree.SetEncoding(const Value: string);
begin
FEncoding := Value;
end;

{ TXMLNode }

procedure TXMLNode.Append(const AName: string);
var
TmpNode : TXMLNode;
begin
TmpNode := TXMLNode.Create(nil);
TmpNode.NodeName := AName;
TmpNode.FParentNode := Self;
FXMLNodes.Add(TmpNode);
end;

procedure TXMLNode.Delete(Index: Integer);
begin
TXMLNode(FXMLNodes[Index]).Free;
FXMLNodes.Delete(Index);
end;

procedure TXMLNode.DeleteMe;
begin
if FParentNode = nil then
begin
//不能删除一个没有父结点的节点
end
else
begin
FParentNode.Delete(FParentNode.FXMLNodes.IndexOf(Self));
end;
end;

procedure TXMLNode.Insert(Index: Integer; const AName: string);
var
TmpNode : TXMLNode;
begin
TmpNode := TXMLNode.Create(nil);
try
TmpNode.NodeName := AName;
TmpNode.FParentNode := Self;
FXMLNodes.Insert(Index, TmpNode);
except
TmpNode.Free;
end;
end;

constructor TXMLNode.Create(AOwner: TXMLNode);
begin
FXMLNodes := TList.Create;
FAttribs := TList.Create;
FParentNode := AOwner;
if FParentNode <> nil then
FParentNode.FXMLNodes.Add(Self);
end;

destructor TXMLNode.Destroy;
begin
ClearAttrib;
FAttribs.Free;
Clear;
FXMLNodes.Free;
inherited Destroy;
end;

function TXMLNode.SaveToText(const ASaveSelf: Boolean = True): WideString;
var
TmpStr : WideString;
I : Integer;
AttribValue : string;
begin
if ASaveSelf then
begin
TmpStr :='<' + NodeName + ' ';
for I := 0 to AttribCount - 1 do
begin
if not VarIsNull(AttribIndexOf) then //写属性
begin
AttribValue := VarToStr(AttribIndexOf);
TmpStr := TmpStr + Format('%s="%s" ', [GetAttribName(I), AttribValue]);
end;
end;
end;
if (NodeCount = 0) and (FText = '') then //如果没有节点
begin
if ASaveSelf then
begin
TmpStr := TmpStr + '/>' + #13;
end;
end
else
begin
if ASaveSelf then
TmpStr := TmpStr + '>' + #13;
if (NodeCount = 0) then
begin
TmpStr := TmpStr + FText + #13;
end
else
begin
for I := 0 to NodeCount - 1 do
begin
TmpStr := TmpStr + XMLNodes.SaveToText;
end;
end;
if ASaveSelf then
TmpStr := TmpStr + Format('</%s >' + #13, [NodeName]);
end;
Result := TmpStr;
end;

function TXMLNode.GetXMLNodes(Index: Integer): TXMLNode;
begin
Result := TXMLNode(FXMLNodes[Index]);
end;

function TXMLNode.GetAttribCount: Integer;
begin
Result := FAttribs.Count;
end;

function TXMLNode.GetAttrib(AttribName: string): Variant;
var
I : Integer;
begin
Result := NULL;
for I := 0 to FAttribs.Count - 1 do
begin
if TNodeAttrib(FAttribs).AttribName = AttribName then
begin
Result := TNodeAttrib(FAttribs).AttribValue;
Exit;
end;
end;
end;

procedure TXMLNode.SetAttrib(AttribName: string; const Value: Variant);
var
I : Integer;
Attrib : TNodeAttrib;
begin
for I := 0 to FAttribs.Count - 1 do
begin
if TNodeAttrib(FAttribs).AttribName = AttribName then
begin
TNodeAttrib(FAttribs).AttribValue := Value;
if (Value = NULL) or (Value = '') then
begin
TNodeAttrib(FAttribs).Free;
FAttribs.Delete(I);
end;
Exit;
end;
end;
Attrib := TNodeAttrib.Create;
FAttribs.Add(Attrib);
Attrib.AttribName := AttribName;
Attrib.AttribValue := Value;
end;

function TXMLNode.GetAttribByIndex(Index: Integer): Variant;
begin
Result := TNodeAttrib(FAttribs[Index]).AttribValue;
end;

procedure TXMLNode.SetAttribByIndex(Index: Integer; const Value: Variant);
var
Attrib : TNodeAttrib;
begin
Attrib := TNodeAttrib(FAttribs[Index]);
Attrib.AttribValue := Value;
end;

function TXMLNode.GetAttribName(Index: Integer): WideString;
begin
Result := TNodeAttrib(FAttribs[Index]).AttribName;
end;

function TXMLNode.GetNodeCount: Integer;
begin
Result := Self.FXMLNodes.Count;
end;

procedure TXMLNode.Clear;
var
I : Integer;
begin
for I := FXMLNodes.Count - 1 downto 0 do
begin
TXMLNode(FXMLNodes).Free;
FXMLNodes.Delete(I);
end;
end;

procedure TXMLNode.ClearAttrib;
var
I : Integer;
begin
for I := FAttribs.Count - 1 downto 0 do
begin
TNodeAttrib(FAttribs).Free;
FAttribs.Delete(I);
end;
end;

end.


{***************************************************************}
{ }
{ }
{ }
{ }
{ }
{ }
{ 封装的XML语法解析器和XML节点对象堆栈 }
{ }
{ wr960204(王锐) 2003/12/10 }
{ QQ:42088303 }
{ }
{***************************************************************}

unit UnitAssistant;

interface

uses
UnitXMLTree,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TTonkenType = (tkNode, tkEndNode, tkAttrib, tkEOF);

TToken = record
TokenType: TTonkenType;
TokenStr: string;
end;

type
TXMLStack = class;

TXMLParser = class //XML文本解析
private
FVersion: string;
FEncoding: string;
FStack: TXMLStack;
FOwner: TXMLNode;
FCurrentNode: TXMLNode;
FText: string;
FSourcePtr: PChar;
FSourceLine: Integer;
function GetSymbol: string;
function GetAttribValue: string;
procedure SkipBlanks;
procedure GetNextNode;
procedure SetText(const Value: string);
public
property Text: string read FText write SetText;
property Version: string read FVersion write FVersion;
property Encoding: string read FEncoding write FEncoding;

function NextToken: TToken;
constructor Create(AOwner: TXMLNode);
destructor Destroy; override;
end;

{ TXMLStack }

TXMLStack = class //XML栈类
private
FItems: TList;
FOwner: TXMLParser;
public
constructor Create(AOwner: TXMLParser);
destructor Destroy; override;

procedure Push(const ANode: TXMLNode); //压入
function Pop: TXMLNode; //弹出

end;

implementation

constructor TXMLStack.Create(AOwner: TXMLParser);
begin
FItems := TList.Create;
FOwner := AOwner;
end;

destructor TXMLStack.Destroy;
begin
FItems.Free;
inherited Destroy;
end;

function TXMLStack.Pop: TXMLNode;
var
Index : Integer;
begin
Result := nil;
Index := FItems.Count - 1;
if Index = -1 then
begin
Exit;
end;
Result := TXMLNode(FItems[Index]);
if (Index - 1) <> -1 then
FOwner.FCurrentNode := TXMLNode(FItems[Index - 1]);
FItems.Delete(Index);
end;

procedure TXMLStack.Push(const ANode: TXMLNode);
begin
FItems.Add(ANode);
FOwner.FCurrentNode := ANode;
end;

{ TXMLParser }

constructor TXMLParser.Create(AOwner: TXMLNode);
begin
FOwner := AOwner;
FCurrentNode := AOwner;
FStack := TXMLStack.Create(Self);
end;

destructor TXMLParser.Destroy;
begin
FStack.Free;
inherited Destroy;
end;

function TXMLParser.GetAttribValue: string;
var
I, J : Integer;
S : PChar;
begin
SkipBlanks;
case FSourcePtr^ of
'"':
begin
Inc(FSourcePtr);
J := 0;
S := FSourcePtr;
while True do
begin
case FSourcePtr^ of
'"':
begin
Inc(FSourcePtr);
if FSourcePtr^ <> '"' then
Break;
end;
end; {end case}
Inc(J);
Inc(FSourcePtr);
end; {end while}
end;
else
//raise EParserError;
end;
SetString(Result, S, J);
end;

procedure TXMLParser.GetNextNode;
begin

end;

function TXMLParser.GetSymbol: string;
var
I, J : Integer;
S : PChar;
begin
SkipBlanks;
S := FSourcePtr;
case FSourcePtr^ of
'A'..'Z', 'a'..'z', '_':
begin
Inc(FSourcePtr);
while FSourcePtr^ in ['A'..'Z', 'a'..'z', '0'..'9', '_'] do
Inc(FSourcePtr);
SetString(Result, S, FSourcePtr - S);
end;
else
Inc(FSourcePtr);
end;
end;

function TXMLParser.NextToken: TToken;

var
I, J : Integer;
S : PChar;
TmpStr : string;

procedure SetAttribs(Obj: TXMLNode);
var
AttribName, AttribValue: string;
begin
AttribName := GetSymbol; //得到属性名
SkipBlanks;
Inc(FSourcePtr); //得到"="
SkipBlanks;
AttribValue := GetAttribValue; //得到属性名
Obj.Attribs[AttribName] := AttribValue;
end;

procedure CreateObj;
var
Obj : TXMLNode;
begin
Obj := TXMLNode.Create(FCurrentNode);
Obj.NodeName := GetSymbol;
FStack.Push(Obj);

SkipBlanks;
while not (FSourcePtr^ in [#0, '>', '/']) do
begin
SetAttribs(Obj);
SkipBlanks;
end;
end;
var
AttribName : string;
TmpNode : TXMLNode;
begin
SkipBlanks;
case FSourcePtr^ of
#0:
begin
Result.TokenType := tkEOF;
Result.TokenStr := '';
Exit;
end;
'<':
begin
SkipBlanks;
case (FSourcePtr + 1)^ of
'?': //开头1行的描述"<?......?>"
begin
Inc(FSourcePtr, 2);

while not ((FSourcePtr^ = '?') and ((FSourcePtr + 1)^ = '>')) do
begin
SkipBlanks;
AttribName := '';
AttribName := AnsiUpperCase(GetSymbol);
if AttribName = AnsiUpperCase('version') then
begin
SkipBlanks;
Inc(FSourcePtr); //跳过等号
FVersion := GetAttribValue;
end;
if AttribName = AnsiUpperCase('Encoding') then
begin
SkipBlanks;
Inc(FSourcePtr); //跳过等号
FEncoding := GetAttribValue;
end;
end;
Inc(FSourcePtr, 2);
end;
'/': //结束符 "</类名"
begin
Inc(FSourcePtr, 2);
//循环弹出,直到遇到为止。因为有时特殊的XML例如Html是不闭合的
//例如<p>就可以不闭合

while True do
begin
TmpNode := FStack.Pop;
TmpStr := GetSymbol;
if (TmpNode = nil) or (TmpNode.NodeName = TmpStr) then
Break;

end;

while (FSourcePtr^ <> '>') do
begin
Inc(FSourcePtr);
if FSourcePtr^ = #0 then
Exit;
end;
Inc(FSourcePtr);
end;
else //生成对象节点 "<类名"
begin
Inc(FSourcePtr);
CreateObj;
case FSourcePtr^ of
'>':
begin
Inc(FSourcePtr);
end;
'/':
begin
Inc(FSourcePtr);
while (FSourcePtr^ <> '>') do
begin
Inc(FSourcePtr);
end;
FStack.Pop;
end;
end;
end;
end; {end case}
end;
else
Inc(FSourcePtr);
end; {end case}
end;

procedure TXMLParser.SetText(const Value: string);
begin
FText := Value;
FSourcePtr := PChar(FText);
end;

procedure TXMLParser.SkipBlanks;
begin
while True do
begin
case FSourcePtr^ of
#0:
begin
Exit;
end;
#10:
Inc(FSourceLine);
#33..#255:
Exit;
end;
Inc(FSourcePtr);
end;
end;

end.

 
呵呵,看看!
 
向您学习!
 
[转贴]天大学生被毒打致死,凶手是青岛高干子弟何宽

天大学生被毒打致死,凶手是青岛高干子弟何宽

元2003年6月16日,在全国著名学府天津大学的校园新修的篮球场上,发生了一件令人发指
的事情。2001级化工学院研究生唐某与同学在篮球场上与本校自考生何某发生口角,唐某
的同学石海峰过去劝架(注意,绝对是劝架),这时另两名何某的朋友(一个是成教学院
的学生,另一个是精仪学院的本科生)从边上过来不由分说上来就打,先将石海峰打到在
地,然后又追打唐某,直至唐某招架不住逃跑,这三人回来之后又对倒在地上的石海峰拳
打脚踢,直至昏迷不醒。

石海峰在被送往医院之后因为伤势过重,在开颅手术之后即诊断为脑死亡,生命危在旦夕
。经检查,石的身上伤口很少,伤口全部都在头部,头骨有裂痕,有目击的同学说肇事者
用脚狂踩头部所致,残忍程度令人发指。石同学呼吸已经几次停止,要用电击才能恢复。


此事在天大的bbs上已经热的发烫,有网友说那些流氓素来作恶多端,曾经殴打看宿舍楼的
大爷,带10几个流氓去一个宿舍楼打一个同学,打的脸都变形了,在篮球场上打架更是常
事。令人纳闷的是他竟然还能在天大校内飞扬跋扈,没得到一点处分!

事情发生后,激起广大同学极大愤慨,但学校竟然将bbs封了,以免泄漏消息,各学院也紧
急开会不让学生有一点动作,事发之后300多同学在北洋广场上为石海峰祈祷,但竟然被各
院的辅导员以处分为威胁强行疏散,最后只剩下一些同学在那里点上蜡烛请上天保佑我们
的朋友能生存下来,但每个人都知道那几乎是不可能的。

自从扩招以来,学校显得日渐拥挤不堪,自习室不够,体育场食堂爆满,这些我们都能忍
受,但我们发现校园里出现越来越多的人渣和垃圾,他们满嘴脏话,在自习室和楼道理大
声谈笑,在操场上频频惹是生非,身上丝毫看不出正在经受高等教育。南开大学曾经有人
在教室里贴上 " 高自考和狗不得入内 " 的标语,就说明了一些事情。当然我不赞成这样
做,因为高自考的学生大部分都是很好的,我认识的人里面高自考的都是很好的人,但不
可否认学校肆无忌惮的扩招的确让许多流氓溜进了校园。打架很多人都尝试过,但那么残
忍的的确罕见(我是指在大学校园里),我为我竟然与这样的人渣在一个校园里,而且同
为外人口中的 " 天大学生" 感到耻辱和悲哀,事实上,在我心中,从来就没把那些人渣当
作同学。

学校的态度让人失望已极,他们为了所谓的名声和虚假的安宁可以无视一个优秀的天大学
子遭到这样的悲剧,那个同学所在学院(化工学院)的领导和老师一力压制学生的情绪。
同样天大所谓的保卫处也让人忍无可忍,他们从来就只会对那些卖书的毕业生颐指气使,
从来就只会在晚上湖边转悠把目光搜寻阴暗处那些情侣,从来就只会在校园门口查那些看
起来柔弱的学生的通行证(因为稍微一瞪眼,它就会放行),从来就只会在轰轰烈烈的打
斗之后,才象乌龟一样探出头来,把一些无关紧要的人员带走盘~~~~,他们从未真正
保卫过学生的安全,有时候他们还是一种威胁。

我是天大一个研究生,与那个受害的同学住在同一个宿舍楼,也一起打过球,他为人很好
,在同学中口碑很好,在广场上为他点燃蜡烛的有很多都是他代毕业设计的本科生。我这
么说不是为了博得大家的同情,事实的确如此。听到这件事的时候我非常震惊,因为说他
打架本来就很奇怪,而且以他的身体素质如果主动打人结果怎么样还真不一定。一个这样
好的人现在躺在病床上奄奄一息了,而且是因为那样的方式,实在让人难以置信,他的父
母都来了,不知道他们该怎么面对这种惨剧。

我不知道事情会以什么样的方式结束,但无论怎样,我的同学都不会回来了。我欲哭无泪
,为凶手的残忍,为学校的态度,为一直以来见到的所有让人愤怒和无奈的事情。不知道
石海峰现在是否闭上了愤怒的双眼,我只想说所有的祈祷都比不上让歹徒付出代价,让校
园得到安宁和平来得实在。 " 正义有时候也许迟到,但正义永远不会缺席 " ,这话很煽
情,但如果正义总是姗姗来迟,那我真的分辨不出正义是否真的胜利了,因为生命已逝,
永远不会回来了!

因为学校的bbs被封了无法登陆,所以想到了天涯。发这个帖子的本意不是博得大家的同情
之泪,只是想让大家知道真相,然后传播,我们需要舆论的压力,作为学生,有时候真的
觉得自己脆弱,面对歹徒无能为力,所以,无需同情,请朋友们给我们力量!

大家发挥网络的力量多多转贴吧,不然这件事就会被这么淹没了。听说凶手们家里有些背
景,而报上为了稳定也不刊登这件事。孙志刚案要不是在网上闹大了也许他也就这么白死
了。

今天看到了海峰,在天津总院的7层重症病房里。周围插着各种仪器,呼吸机,输液仪,维
持体温的冰毯......可以听到呼吸声,但我知道这只是呼吸机在强迫海峰呼吸。昔日生龙
活虎的大小伙子,就静静地躺在那里,两只眼睛贴着一些类似塑料片的东西(医生说因为
瞳孔已经开始扩散,这样做是为了保护视网膜),头发已经都没有了,后脑被纱布包着,
估计是在那里做的手术,在头顶偏前的地方可以看到一条4、5公分左右的伤口,不知道是
不是医生说的裂痕.....我哭了,同去的几个女同学也哭了。听一个医生讲,他在神经外科
这么多年,接诊的病人中颅骨损伤如此严重的非常少见,也就两三个,而且都是恶性车祸
造成的,还说了一个术语,说海峰现在是"脑疝"(不知道是不是这两个字,谐音)。而海
峰是被打成这样的,被活活用脚踢、用脚跺成这样的,而他只是为了劝架,和凶手没有任
何恩怨,他们就这么狠,这么没有人性........



从医院下来见到海峰的母亲,被两个女同学扶着。阿姨见到我们就问:"见到海峰了没有?
"我们说见到了,阿姨接着说"没想到啊,没想到啊。"阿姨后来也突然问我:"有没有摸摸
海峰的手脚啊?","没",阿姨说"感觉海峰有点恢复,昨天手脚冰凉冰凉的,今天好像温
乎点",母亲是多么希望海峰能出现转机啊,抱着多么大的希望啊,可是实际上海峰现在的
体温完全是靠仪器维持着......听下午的主任医生讲,他们用很多种手段来测试,介绍了
一些医学上的指标,有的听不太懂,大概是说先测试大脑是否死亡,用的叫"五波",从耳
廓一直到大脑深层,一共有五个电位(好像是这个名词),如果大脑还活着,那么用声音
刺激这些部位就会有反映,海峰的结果是左脑没有任何反应,右脑只有"一波"(也就是耳
廓)有微弱的反应。他们停止呼吸机,看海峰是否能自主呼吸,结果是不能,海峰的血压
是用药物维持着......唯一令我们抱着一点希望的,就是医生说"病人的体质很好,所以他
的心脏还在跳动"。听一个老师讲,本来已开始的时候医生就想宣布死亡了,因为在医学上
脑死亡就等于死亡,后来海峰的导师跟医生说因为家长还没有到,希望能维持一下......
不知道海峰曾经忍受或正在忍受着多大的痛苦,但我们知道他那颗心脏还在顽强的跳动....阿姨跟我们念叨说"海峰身上没有伤,胳膊也没有伤,肯定是被打
倒的时候就已经失去知觉了,要不然他会用胳膊抱住头的,胳膊上就会有伤了........"阿
姨平静地跟我们叙述着,但我们知道她此时的内心是多么的痛苦,因为那是自己的儿子啊
......晚上走的时候,跟海峰的父亲说我们要走了,海峰的父亲嘱咐我们说:"再去看看海
峰,再去看看海峰......",他的那种神情我无法描述,一下午了,感觉他整个人就已经懵
了....走的时候又去看了海峰,看见海峰的妹妹海霞,弯着腰,脸离海峰很近,静静地看
着他哥哥......



一家人承受着多么大的痛苦。



我们跟医生建议能不能请曾经救治刘海若的凌峰医生来,又提供了一些我们能打听到的最
好的神经外科大夫和医院的名单,希望天津医院能够邀请这些专家来给海峰会诊。主任医
师向我们解释海峰的病和刘海若的病不一样,刘海若当时并不是脑死亡,否则根本无法救
治,而且天津医院在神经外科方面已经很权威了,所有可以尝试的方案他们都会去做,但
是他们还是同意了向其他医院发出会诊的邀请,因为大家都觉得那怕是有一丝希望,都要
去努力争取......我们每个人都在期盼着奇迹能够在海峰身上出现。

到现在为止,还没有任何一家正式的媒体报道此事,而这么恶劣的事情,这么令人发指的
校园暴力事件,难道不值得更广泛的社会关注么,不应该有更多的人知道么,媒体为什么
都在沉默?我们不是想造什么轰动效应,不是想搞什么舆论,我们只是想这种事情真实的
发生了,我们希望能够有媒体,对此事件的过程进行客观的观察报道,能为海峰做点什么
,能够有更多的人知道,更多的人关注,更多的人思考......希望大家能给海峰一些关注
,为海峰呼吁,为海峰祝福.......

 
为海峰呼吁,为海峰祝福.......
代码我需要,但是良心我更需要!!
希望能够活下来!!!!
代码可以重新写
人不可以重新活
 
为海风祈祷
歹涂诅咒


 
学习学习

谢谢
 
后退
顶部