我使用以下代码将XML导入数据集:
DataSet dataSet = new DataSet();
dataSet.ReadXml(file.FullName);
if (dataSet.Tables.Count > 0) //not empty XML file
{
da.ClearFieldsForInsert();
DataRow order = dataSet.Tables["Orders"].Rows[0];
da.AddStringForInsert("ProductDescription", order["ProductDescription"].ToString());
}
'
等特殊字符未按照我原先的想法转换为'
。
我可以在代码中自行转换它们,但我们认为ReadXML
方法应该自动执行。
我在这里错过了什么吗?
编辑:
XML文件的相关行:
<ProductDescription>Grey 'Aberdeen' double wardrobe</ProductDescription>
编辑:
然后我尝试使用XElement
:
XDocument doc = XDocument.Load(file.FullName);
XElement order = doc.Root.Elements("Orders").FirstOrDefault();
...
if (order != null)
{
da.ClearFieldsForInsert();
IEnumerable<XElement> items = doc.Root.Elements("Orders");
foreach (XElement item in items)
{
da.ClearFieldsForInsert();
da.AddStringForInsert("ProductDescription", item.Element("ProductDescription").value.ToString());
}
仍未转换!
答案 0 :(得分:1)
如上所述here,'
是有效的XML转义码。
但是,没有必要在元素值中转义'
。
<ProductDescription>Grey 'Aberdeen' double wardrobe</ProductDescription>
是有效的XML。
除了解决方法之外,符合标准的XML解析器应该遵守预定义的实体,无论它们出现在哪里(CDATA除外)。
文档中记录了Data.ReadXml
的这种脆弱性和偏离标准XML解析的偏差。我引用:
DataSet 本身只能逃脱非法行为 XML元素名称中的XML字符因此只能使用 相同。当转义XML元素名称中的合法字符时, 处理时忽略元素。
由于其局限性,我不会使用DataTable.ReadXml
进行XML解析。相反,您可以使用XDocument
这样的东西,
using System.Xml.Linq;
...
var doc = XDocument.Load(file.FullName);
var order in doc.Root.Elements("Order").FirstOrDefault();
if (order != null)
{
da.ClearFieldsForInsert();
var productDescription = order.Element("ProductDescription");
da.AddStringForInsert(
"ProductDescription",
productDescription.Value);
}