XmlSerializer 在文件中加载“作为”反序列化期间 - 当 XML 包含希伯来语时
Posted
技术标签:
【中文标题】XmlSerializer 在文件中加载“作为”反序列化期间 - 当 XML 包含希伯来语时【英文标题】:XmlSerializer loads “ in file as "e; 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
包括 "
字符。反序列化后,此字符将替换为 &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 标头中使用什么编码?您的示例反序列化为\"
对我来说不是 &quot;
。
双引号是xml中的特殊字符,Net库会自动替换该字符。见维基:en.wikipedia.org/wiki/…
实际上,只有在属性值中才需要将"
转义为&quot;
(并且仅当"
用作分隔符时;但许多序列化程序有点懒惰并应用相同的规则对于属性和文本节点 - 输出完全正确,任何正确编写的 XML 应用程序都应该可以接受。
【参考方案1】:
如果我没记错的话,虽然产品的 ItemName
属性的预览会在字符串中包含 &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 文件的顶部添加 <?xml version="1.0" encoding="utf-8" ?>
。
【讨论】:
这需要一个非常不同的序列化器声明,因为它不支持编码参数。见:[链接](docs.microsoft.com/en-us/dotnet/api/…)以上是关于XmlSerializer 在文件中加载“作为”反序列化期间 - 当 XML 包含希伯来语时的主要内容,如果未能解决你的问题,请参考以下文章
在 tinymce 编辑器中加载 html 文件作为初始内容
我如何在控制器函数中加载目录作为视图:Codeigniter