zoukankan      html  css  js  c++  java
  • 实体格式化转xml

    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命名空间及声明头不影响反序列化,

    直接上代码:

    [csharp] view plain copy
     
    1. // 序列化这个对象  
    2. int obj = 1;  
    3. XmlSerializer serializer = new XmlSerializer(obj.GetType());  
    4.   
    5. // 将对象序列化输出到文件  
    6. FileStream stream = new FileStream("hh.xml", FileMode.Create);  
    7.   
    8. XmlWriterSettings settings = new XmlWriterSettings();  
    9. settings.Indent = true;  
    10. settings.IndentChars = "    ";  
    11. settings.NewLineChars = " ";  
    12. settings.Encoding = Encoding.UTF8;  
    13. //settings.OmitXmlDeclaration = true;  // 不生成声明头  
    14.   
    15. using (XmlWriter xmlWriter = XmlWriter.Create(stream, settings))  
    16. {  
    17.     // 强制指定命名空间,覆盖默认的命名空间  
    18.     XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();  
    19.     namespaces.Add(string.Empty, string.Empty);  
    20.     serializer.Serialize(xmlWriter, obj, namespaces);  
    21.     xmlWriter.Close();  
    22. };  
    23. 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 就解决这个问题了呢???

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

  • 相关阅读:
    数据库性能优化
    AutoDetectChangesEnabled及AddRange解决EF插入的性能问题
    实体框架 5 性能注意事项
    使用JS传递数组型数据回服务器
    Code First配合Entity Framework Power Tools Beta 4使用
    HighChart 体验之旅 (后台传递JSON参数和数据的方法)
    System.Transactions事务超时设置
    ASP.NET站点部署相关
    js 字符串转化成数字
    发布.net 4.0的站点到IIS7.5下时无法访问
  • 原文地址:https://www.cnblogs.com/Alex80/p/8832279.html
Copyright © 2011-2022 走看看