In the past, I've done the following to control datetime serialization:

  • Ignore the DateTime property.
  • Create a dummy string property that serializes/deserializes the way I want

Here is an example:

public class SomeClass
{
[XmlIgnore]
public DateTime SomeDate { get; set; } [XmlElement("SomeDate")]
public string SomeDateString
{
get { return this.SomeDate.ToString("yyyy-MM-dd HH:mm:ss"); }
set { this.SomeDate = DateTime.Parse(value); }
}
}
 
 
 

去掉XML命名空间及声明头不影响反序列化,

直接上代码:

  1. // 序列化这个对象
  2. int obj = 1;
  3. XmlSerializer serializer = new XmlSerializer(obj.GetType());
  4. // 将对象序列化输出到文件
  5. FileStream stream = new FileStream("hh.xml", FileMode.Create);
  6. XmlWriterSettings settings = new XmlWriterSettings();
  7. settings.Indent = true;
  8. settings.IndentChars = "    ";
  9. settings.NewLineChars = "\r\n";
  10. settings.Encoding = Encoding.UTF8;
  11. //settings.OmitXmlDeclaration = true;  // 不生成声明头
  12. using (XmlWriter xmlWriter = XmlWriter.Create(stream, settings))
  13. {
  14. // 强制指定命名空间,覆盖默认的命名空间
  15. XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
  16. namespaces.Add(string.Empty, string.Empty);
  17. serializer.Serialize(xmlWriter, obj, namespaces);
  18. xmlWriter.Close();
  19. };
  20. stream.Close();

这几天碰到一个让人很头疼的问题,写了一个webService,接收一个xml格式的字符串进行解析,

使用如下代码:

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.LoadXml(xmlString);  // 此行错误:根级别上的数据无效。第一行,位置1

意思是xml字符串首行首字符前有不干净的“东西”,调试过程中,未发现有任何字符存在;

于是,把字符串拿去格式化,在项目中新建了一个xml文件,把字符串粘贴进去,发现格式化之后,首行有红色错误提示;把光标移到首行,按了一下Backspace 键,奇怪,红色错误消失了,那说明肯定有不明物体存在;

又于是,修改代码,尝试 xmlString.trim(); 任报错;C 读取XML 错误:根级别上的数据无效。 第 1 行,位置 1 - 坦诚 - 坦诚

仔细思考了一番,猜测估计是编码问题导致,于是乎,对字符串进行编码处理:

xmlString = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(xmlString));

但是任然无效!

后来,网上查了查,因为不知道客户发过来是什么编码格式,那么,就取默认编码,再转换为我想要的utf-8格式吧

Encoding encoding = Encoding.GetEncoding("utf-8");

string xmlString = encoding.GetString(Encoding.Convert(Encoding.Default, encoding,  Encoding.Default.GetBytes(xmlString)));

调试发现:编码转换之后的确有效,字符串最前面出现了一个? 号,因为不是xml的标准格式,当然不能通过XmlDocument 加载了。

逼的没办法,只好这么干了:

xmlString.TrimStart("?");

真的成功了,问题暂时得到解决了!!!好高兴啊~ 哈哈哈   C 读取XML 错误:根级别上的数据无效。 第 1 行,位置 1 - 坦诚 - 坦诚

得瑟一天之后,新的问题又来了。。。 C 读取XML 错误:根级别上的数据无效。 第 1 行,位置 1 - 坦诚 - 坦诚

测试站点发布之后,客户调用webservice ,接收到xmlString ,加上上面的代码之后,去掉问号,发现文件中的中文变成乱码了!!!哎呀,我去~  编码也不对,不编码又不行~~  这可咋办!!!

后来,通过验证,客户发送出来确实是正常的,还是接收到后处理的问题;

不能进行编码,又要保证能转化成为XmlDocument对象,后来发现XmlDoc对象还有一个方法:

xmlDoc.Load(stream);

既然支持stream的方式读取,那么为何不先转换为stream呢,突然有些窃喜.... C 读取XML 错误:根级别上的数据无效。 第 1 行,位置 1 - 坦诚 - 坦诚 OK!

试一试:

byte[] buffer = encoding.GetBytes(xmlString);

MemoryStream ms = new MemoryStream(buffer);

xmlDoc.Load(ms);

C 读取XML 错误:根级别上的数据无效。 第 1 行,位置 1 - 坦诚 - 坦诚  果不其然,解决了问题!我得意的笑!!!C 读取XML 错误:根级别上的数据无效。 第 1 行,位置 1 - 坦诚 - 坦诚

在这个案例中,肉眼无法在首字符位置发现任何异常,通过trim()、substring() 等方法也都无法发现这个特殊字符,但是XmlDoc 告诉我们确有不明字符,那么,只能是编码的问题了,但是,为什么用stream 就解决这个问题了呢???

问题的根本原因、原理,我就没有再去研究了,如果哪位大侠看到了我的帖子,并且有兴趣,可以共同探讨!

实体格式化转xml的更多相关文章

  1. C#实体类生成XML与XML Schema文档

    一.实体类生成XML private void CreateXML() { Type[] objType = DBEntityRegst(); foreach (var item in objType ...

  2. 简单实体类和xml文件的相互转换

    最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简 ...

  3. 使用C#实现实体类和XML相互转换

    一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T& ...

  4. HTTP 响应实体主体:XML 及 XML parser

    本文内容 HTTP 响应实体主体:XML XML parser 总结 各编程语言实现的 XML parser   HTTP 响应实体主体:XML 实体主体(entity-body)通常是HTTP响应里 ...

  5. C#实体类与XML相互转换

    1.实体类与XML相互转换 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化. 把XML转换成相应的实体类,需要使用到XmlSerializer类的De ...

  6. Linq创建带命名空间、前缀、Soap格式的XML

    关于XML,我也是刚接触,关于一般常见的XML,博客园.CSDN上的资料很多,对于不常见的带命名空间.前缀.Soap格式的XML的描述相对来说寥寥无几,上一篇我写到了对相对复杂的XML的读操作,下面说 ...

  7. Linq解析带命名空间、前缀、Soap格式的XML

    关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...

  8. 利用JAXB实现java实体类和xml互相转换

    1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...

  9. 节点文件将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML

    本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ 经常有的需求是,需要将一种格式的XML转换成另一种XML.如果要实现这个功能首先需要将两个不同XML手动建立节点对比关系.然后 ...

随机推荐

  1. Java-JUC(一):volatile引入

    问题背景: volatile是为了解决内存可见性而生的,什么是内存不可见性呢? 以下边的代码为例: package com.dx.juc; public class VoltileTest { pub ...

  2. Visual stuido 项目路径的奇怪问题

    从别人那里以zip的形式接受了一个solution, 然后在接收目录解压缩,然后剪切到其他的目录.此时报错,说找不到项目文件,看Visual studio 寻找的详细路径,发现它还是到解压缩的那个目录 ...

  3. Git创建分支/GIT提交分支

    git clone xxx.git cd fwspp-react git init touch README.md git add README.md git commit -m "add ...

  4. 【Nodejs】外研社小学英语教材一年级起各年级英语音频下载(全)

    两个爬虫合作成的,放在这里分享给有需要的人. 下载地址:https://pan.baidu.com/s/19hJ59SsX9uTfFtBxaRxJ8A 2018年5月10日

  5. Wifidog的协议梳理

    上篇文章结合wifidog的协议,讲解了如何实现wifi认证.这篇文章会详细讲解一下wifidog的协议. wifidog的认证流程图 用户连接WIFI会跳转到以下地址: 1 2 3 4 5 6 7 ...

  6. iOS的settings bundle中开关button(Toggle Switch)取不到值的问题

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 在Xcode7.2中设置App的settings bundle ...

  7. AS-->创建项目(慢)和打开项目(慢)等需要注意的问题

    Android Studio 创建新项目的时候,会在进度条的界面滞留很久. 有时候一天都卡在这. 打开其它项目有些时候,也会出现这种情况. 主要的原因就是, 此过程正在 下载对应版本的 gradle. ...

  8. Skyline开发4-IProject接口

    IProject接口可以访问工程设置和打开保存工程的基本方法. 属性 FileVersion:返回 ITEVersionInfo.表示当前运行的TerraExplorer的版本,可通过ITEVersi ...

  9. 面试小结之Elasticsearch篇

    https://www.cnblogs.com/luckcs/articles/7052932.html

  10. 使用Swashbuckle.AspNetCore生成.NetCore WEBAPI的接口文档

    一.问题 使用Swashbuckle.AspNetCore生成.NetCore WEBAPI的接口文档的方法 二.解决方案 参考文章:https://docs.microsoft.com/zh-cn/ ...