这种写法能够支持指定字符编码,不会出现中文乱码问题。
filepath = filepath + dt+"/"+video.getChanelid()+"/";
String filename = video.getVideoid() +".xml"; File dir = WriteHistory.createFileDirectory(filepath); File file = new File(dir,filename); Writer wr = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(file),"utf8")); document.write(wr); wr.close();
以下这种格式会出现中文乱码问题:
newFolder(filepath,dt,video.getChanelid());
XMLWriter writer = new XMLWriter(new FileWriter(new writer.write(document); writer.close(); File(filepath+dt+"/"+video.getChanelid()+"/"+video.getVideoid()+".xml")),format);
Dom4j无法以UTF-8保存xml文件,Invalid byte 2 of 2-byte UTF-8 sequence -hxzon动手 -gdo
这几天开始学习dom4j,在网上找了篇文章就开干了,上手非常的快,但是发现了个问题就是无法以UTF-8保存xml文件,保存后再次读出的时候会报
“Invalid byte 2 of 2-byte UTF-8 sequence.”这样一个错误,检查发现由dom4j生成的这个文件,在使用可正确处理XML编码的任何的编辑器中中文成乱码,从记事本查看并不会出 现乱码会正确显示中文。让我很是头痛。试着使用GBK、gb2312编码来生成的xml文件却可以正常的被解析。因此怀疑的dom4j没有对utf-8编 码进行处理。便开始查看dom4j的原代码。终于发现的问题所在,是自己程序的问题。
在dom4j的范例和网上流行的《DOM4J 使用简介》这篇教程中新建一个xml文档的代码都类似如下
public void createXML(String fileName) {
document.nbspdoc = org.dom4j.document.elper.createdocument.); Element root = doc.addElement("book");
root.addAttribute("name", "我的图书");
Element childTmp;
childTmp = root.addElement("price");
childTmp.setText("21.22");
Element writer = root.addElement("author");
writer.setText("李四");
writer.addAttribute("ID", "001");
try {
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter( new FileWriter(fileName));
xmlWriter.write(doc);
xmlWriter.close();
}
catch (Exception e) {
System.out.println(e);
}
}
在上面的代码中输出使用的是FileWriter对象进行文件的输出。这就是不能正确进行文件编码的原因所在,java中由Writer类继承下来的子类 没有提供编码格式处理,所以dom4j也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存,在中文版的 window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的,所以这也就是 为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。
好了现在我们找到了原因所在了,我们来找解决办法吧。首先我们看看dom4j是如何实现编码处理的
public XMLWriter(OutputStream out) throws UnsupportedEncodingException {
//System.out.println("In OutputStream");
this.format = DEFAULT_FORMAT;
this.writer = createWriter(out, format.getEncoding());
this.autoFlush = true;
namespaceStack.push(Namespace.NO_NAMESPACE);
}
public XMLWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {
//System.out.println("In OutputStream,OutputFormat");
this.format = format;
this.writer = createWriter(out, format.getEncoding());
this.autoFlush = true;
namespaceStack.push(Namespace.NO_NAMESPACE);
}
/**
* Get an OutputStreamWriter, use preferred encoding.
*/
protected Writer createWriter(OutputStream outStream, String encoding) throws UnsupportedEncodingException {
return new BufferedWriter(
new OutputStreamWriter( outStream, encoding )
);
}
由上面的代码我们可以看出dom4j对编码并没有进行什么很复杂的处理,完全通过java本身的功能来完成。所以我们在使用dom4j的来生成我们的 XML文件时不应该直接为在构建XMLWriter时,不应该直接为其赋一个Writer对象,而应
该通过一个OutputStream的子类对象来构 建。也就是说在我们上面的代码中,不应该用FileWriter对象来构建xml文档,而应该使用FileOutputStream对象来构建所以将代码 修改入下:
public void createXML(String fileName) {
document.nbspdoc = org.dom4j.document.elper.createdocument.); Element root = doc.addElement("book");
root.addAttribute("name", "我的图书");
Element childTmp;
childTmp = root.addElement("price");
childTmp.setText("21.22");
Element writer = root.addElement("author");
writer.setText("李四");
writer.addAttribute("ID", "001");
try {
//注意这里的修改
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter( new FileOutputStream(fileName));
xmlWriter.write(doc);
xmlWriter.close();
}
catch (Exception e) {
System.out.println(e);
}
}
至此DOM4J的问题编码问题算是告一段落,希望对此文章对其他朋友有用。
第二篇:XML操作总结
查询
步骤:1.判断文件是否存在
2.进行读取——(1)创建数据表(2)创建数据列
(3)将数据列的对象添加到数据表(4)加载文件
(5)创建数据行并添加数据(6)将数据行的对象添加到数据表
(7)将数据表数据赋给DataGradView的DataSource;
*(8)更改DataGradView的列名
详解:
1.验证文件
if(File.Exists(“文件名”)==true)
{ 存在 }
2.(1)创建数据表
DataTable dt = new DataTable();创建数据表
(2)创建数据列(可以没数据类型)
DataColumn dc = new DataColumn("列名","数据类型");
(3)将数据列的对象添加到数据表
dt.Columns.Add(dc);
(4)加载文件
XmlDocument xmlDoc = new XmlDocument();实例化根节点
xmlDoc.Load("Xml文件名");读取该文件的结构
(5) 创建数据行并添加数据
XmlNodeList xnlList =xmlDoc.SelectSingleNode("节点名").ChildNodes; 获取该节点下的所有子节点!存入到节点集合中
for( int i=0;i〈xnlList.Count;i++ )
{
DataRow dr = dt.NewRow();创建数据行
dr[“列名”]=xnlList.Item(i).ChildNodes[“该节点”].InnerText;
dr.Rows.Add(dr); 将数据行添加到数据表
}
获取xnlList中的第i个子节点
xnlList.Item(i) 或 xnlList[i]
获取xlList中的第i个子节点下的第0个子节点
xnlList.Item(i).ChildNodes[0]. InnerText ;
xnlList[i].InnerText;
(6) 将数据行的对象添加到数据表
dt.Rows.Add(dr); dr是数据行实例的对象
(7) 将数据表数据赋给DataGradView的DataSource;
控件名.DataSource =dt
(8)更改DataGradView的列名
this.dgv. Columns[“列名”]. HeaderText=“要显示的列名”
添加
步骤:1.判断文件是否存在 (略)
2.进行添加——(1)加载文件 (2)查找根节点 (3)创建不同节点
(4)给节点添加内容 (5)创建属性 (6)给属性赋值
(7)将属性添加到不同节点 (8)建立节点之间的从属关系
(9)保存文件
详解:
进行添加
(1)加载文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(“文件名”);
(2)查找根节点
XmlNode xmlNode = xmlDoc.SelectSingleNode(“节点名”);
(3)创建不同节点
XmlElement 节点对象名 = xmlDoc.createElement_x(“节点名”);
(4)给节点添加内容
节点对象名.InnerText =“要赋的值”;
(5)创建属性
XmlAttribute 属性对象名 = xmlDoc.CreateAttribute(“属性名”);
(6)给属性赋值
属性对象名。Value =“值”;
(7)将属性添加到不同节点
节点对象名.Attribute。Append(属性对象名);
(8)建立节点之间的从属关系
Eg:
XmlElement AA = xmlDoc.createElement_x(“A”);
XmlElement BB = xmlDoc.createElement_x(“B”);
AA.AppendChild(BB)——使BB节点成为AA的子节点
(9) 保存文件
xmlDoc.Save(“文件名”);
删除
步骤:1.判断xml文件是否存在。
2.删除操作——(1)加载文件(2)获取节点下的所有子节点,并进行判断
(3)删除(4)保存文件
详解:
(1) 略
(2) 一般根据id节点删除或者id属性删除!则,必须先知道id节点在什么位置!然后先获得它的父节点!暂借以学生管理系统为例。它的xml结构如下:
〈?xml version="1.0"?>
〈Student>
〈StudentMessage ManagerName="学生">
〈id NAME="编号">1〈/id>
〈Name NAME="姓名">胡子〈/Name>
〈Age NAME="年龄">21〈/Age>
〈Sex NAME="性别">男〈/Sex>
〈CreateDate NAME="注册日期">20xx-4-8〈/CreateDate>
〈/StudentMessage>
〈Student>
获得〈Student〉节点下的子节点〈StudentMessage> 存入节点结合中!现在集合的长度为2
XmlNodeList xnl = xmlDoc.SelectSingleName(“Student”).ChildNodes;
因为〈id〉节点是〈 StudentMessage 〉节点下的第0个节点即 FirstChild 但此方法有局限性!id刚好是第以各节点,所以可以直接用FirstChild ,这个方法(一)在更新时用方法(二)!
String id =xnl[0].FrstChild.InnerText;
If(id==“单击某条信息后获得的该条信息的id”)
{
xmlDoc.SelectSingleNode(“Student”).RomoveChild(xnl[0]);
MessageBox.Show(“OY成功”);
}
(3) 删除
for(int i=0;i〈xnl.Count;i++) 一定要在for循环中判断
{
If(id==“单击控件后获得的id”)
{
xmlDoc.SelectSingleNode(“Student”).RemoveChild(xnl[0]);
MessageBox.Show(“OY成功”);
}
}
RemoveChild(“节点名”)——移除制定的子节点
xnl [0]——〈 StudentMessage〉节点
XmlDoc.SelectSingleNode(“Student”);.RemoveChild(xnl[0]);——
〈Student〉节点中的〈 StudentMessage〉节点
(4) 保存
xmlDoc.Save(“文件名”);
【更新】 删除
步骤:1.判断xml文件是否存在。
2.更新操作—— (1)加载文件(2)获取节点下的所有子节点,并进行判断
(3)修改(4)保存
详解:
(1)略
(2)同删除一样,也要获得id所在的节点位置;现在用方法(二)获得id 〈?xml version="1.0"?>
〈Student>
〈StudentMessage ManagerName="学生">
〈id NAME="编号">1〈/id>
〈Name NAME="姓名">胡子〈/Name〉
〈Age NAME="年龄">21〈/Age>
〈Sex NAME="性别">男〈/Sex>
〈CreateDate NAME="注册日期">20xx-4-8〈/CreateDate>
〈/StudentMessage>
〈Student>
获得〈Student〉节点下的子节点〈 StudentMessage 〉存入节点结合中!现在集合的长度为2
XmlNodeList xnl = xmlDoc.SelectSingleName(“Student”).ChildNodes; Foreach(XmlNode node in xnl)
{
XmlElement xe = (XmlElement)node;
XmlNodeList xnlId =xe.GetElementByTagName(“id”);
If(xnlId>0)
{
If(xnlId[0].InnerText==“单击某条信息后获得的该条信息的id”)
{
XmlNodeList xnl2 =xe.ChildNodes;
Foreach(XmlNode node2 in xnl2)
{
XmlElement xe2 = (XmlElement)node2;
If(xe2.Name==”Name”)
{
xe2.InnerText =“更改的值”
}
.. .. .. .. ..
}
}
}
}
String id =xnl[0].FrstChild.InnerText;
XmlElement xe = (XmlElement) node;——将节点转换成为元素
Xe.GetElementByTagName(“id”); ——它返回的该节点下的所有子代元素列表,也是集合!
XmlNodeList xnlId =xe.GetElementByTagName(“id”)——之所以转换,我认为就是为了通
XmlElement对象的方法 xe.GetElementByTagName(“节点名”)——获得该节点下的内容!
XnlId[0].InnerText——获取集合下标为 0 的元素!
XnlId.Item(0).ChildNodes[0].InnerText——也可以这样获取下标为0的元素
注:以上各总结,仅供参考理解!解法不唯一
第三篇:护理技能操作总结
为加强对全院护理质量的监控,根据护理质量管理要求,于20xx年x月x日对全院的临床科室护理人员进行护理技术考核,各科室抽考1人,共抽考18人(1个科室缺考),其中__人不达标,达标率为___。
各科室抽考的护理人员都进行了考核,大部分质量较好,但也存在较多的问题。皮内注射、皮下注射、肌肉注射存在以下问题:1护士规范化操作不熟练,在考核中不断出顺序颠倒,有的甚至在操作结束后才想起所遗忘的部分。2、操作前后评估欠缺应引起重视。3、忽视无菌观念。操作后忘记洗手,铺无菌盘及使用无菌盘不规范。4、理论知识欠缺。皮试液的剂量单位不清楚,臀大肌无法定位。5、未能真正体现以患者为中心的理念。在操作中不注意与患者进行主动沟通,体位摆放不合理(肌注上下肢伸屈),操作中患者暴露过久。心肺复苏存在以下问题:1、①未能及时呼救。②评估患者意识、呼吸方面:存在颈动脉定位部位不准确;触摸颈动脉时间过短或过长。③人工循环方面:存在按压部位定位手法不正确;按压姿势不正确,未用掌根、手指未互握上翘或肘关节不直;按压频率过快或过慢;按压幅度过深或过浅;2分钟内无法完成5个循环的操作。④未检查颈部情况。⑤人工呼吸方面: 不能进行有效的开放气道(手法不正确、头后仰不够);未检查口腔异物;清理呼吸道方法错误(头未侧一边),吹气方法错误(未观察胸廓起伏情况、吹气时未捏鼻、吹气后未立即放松鼻孔、两次吹气无间隙)。