XmlSerializer 在文件中加载“作为”反序列化期间 - 当 XML 包含希伯来语时

Posted

技术标签:

【中文标题】XmlSerializer 在文件中加载“作为”反序列化期间 - 当 XML 包含希伯来语时【英文标题】:XmlSerializer loads “ in file as &quote; during deserialization - when XML contains Hebrew 【发布时间】:2020-08-23 19:44:25 【问题描述】:

这是我的 xml:

<Product>
<ItemCode>123456</ItemCode>
<ItemName>תמצית מרווה משולשת  SP 1:2 - מ"ל 100</ItemName>
<FrgnName>Salvia fruitcosa</FrgnName>
</Product>

ItemName 包括 " 字符。反序列化后,此字符将替换为 &amp;quot;。 这是我的代码:

var serializer = new XmlSerializer(typeof(ProductXmlWrapper));
using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
  

     var product = (ProductXmlWrapper)serializer.Deserialize(fileStream);

     if (product != null)
     
       SaveDataToDb(product.BO.Product);
     
  

那么我应该改变什么?是否取决于编码?

【问题讨论】:

@user2864740 这个问题只发生在希伯来语文本中 @MichaelKostiuchenko 您在 xml 标头中使用什么编码?您的示例反序列化为 \" 对我来说不是 &amp;quot; 双引号是xml中的特殊字符,Net库会自动替换该字符。见维基:en.wikipedia.org/wiki/… 实际上,只有在属性值中才需要将"转义为&amp;quot;(并且仅当"用作分隔符时;但许多序列化程序有点懒惰并应用相同的规则对于属性和文本节点 - 输出完全正确,任何正确编写的 XML 应用程序都应该可以接受。 【参考方案1】:

如果我没记错的话,虽然产品的 ItemName 属性的预览会在字符串中包含 &amp;quot;\" 作为特殊字符,但这不会影响该属性的使用。

我使用以下内容进行了测试,并将 XML 文件的内容准确地打印到控制台:

    class Program
    
        static void Main(string[] args)
        
            Console.OutputEncoding = Encoding.UTF8;

            string file = @"Input.xml";
            var serializer = new XmlSerializer(typeof(ProductXmlWrapper));
            using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
            
                var product = (ProductXmlWrapper)serializer.Deserialize(fileStream);
                Console.WriteLine(product.ItemName);
            
        
    

    [XmlRoot(ElementName = "Product")]
    public class ProductXmlWrapper
        
        public string ItemCode  get; set; 
        public string ItemName  get; set; 
        public string FrgnName  get; set; 
    

我的 XML:

<?xml version="1.0" encoding="utf-8" ?>
<Product>
  <ItemCode>123456</ItemCode>
  <ItemName>תמצית מרווה משולשת  SP 1:2 - מ"ל 100</ItemName>
  <FrgnName>Salvia fruitcosa</FrgnName>
</Product>

当然,我的电脑没有设置为支持希伯来语 (?) 字符,但 " 是按照 XML 输出的。

【讨论】:

【参考方案2】:

您可以使用 XmlReader 代替流,并使用“utf-8”进行编码:

string file = @"Input.xml";     
using (var xmlreader = XmlReader.Create(file))
                
                    var product = (ProductXmlWrapper)serializer.Deserialize(xmlreader,"utf-8");
                    Console.WriteLine(product.ItemName);
                

还要在 xml 文件的顶部添加 &lt;?xml version="1.0" encoding="utf-8" ?&gt;

【讨论】:

这需要一个非常不同的序列化器声明,因为它不支持编码参数。见:[链接](docs.microsoft.com/en-us/dotnet/api/…)

以上是关于XmlSerializer 在文件中加载“作为”反序列化期间 - 当 XML 包含希伯来语时的主要内容,如果未能解决你的问题,请参考以下文章

在 tinymce 编辑器中加载 html 文件作为初始内容

我如何在控制器函数中加载目录作为视图:Codeigniter

在java中加载一个类作为组件

基于感兴趣的日期范围作为参数输入限制在 Pig Latin 中加载日志文件

Xamarin iOS 在 UIWebView 中加载内容

C# XMLSerializer 将错误的类型反序列化为 List