读取XML时无法转换特殊字符

3

我正在使用以下代码将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 &apos;Aberdeen&apos; 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());

    }

仍然无法转换!


3
请提供一个简短但完整的程序,包括XML和您正在诊断的结果DataSet,以展示问题。 - Jon Skeet
1个回答

1
正如这里所述,&apos;是一个有效的XML转义代码。
但是,在元素值中不需要转义'
<ProductDescription>Grey 'Aberdeen' double wardrobe</ProductDescription>

是有效的XML。

除了解析CDATA之外,符合标准的XML解析器应该尊重预定义实体的使用。

这种脆弱性和偏离标准XML解析的问题,Data.ReadXml在文档中有所提及。我引用:

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);
}

@EMett,抱歉,我的原始回答是错误的,我已经修改了。 - Jodrell
我又更新了问题。简言之,DataTable.ReadXml 函数出现了问题。 - Jodrell
@EMett,基本上不要使用DataTable.ReadXml,而是使用XDocument - Jodrell
我尝试使用XElement,但仍然无法转换。我编辑了问题以包含此演示。 - E Mett
@EMett,你最好遵循Jon Skeet的建议。如果没有一些失败的XML示例,继续下去会很困难。 - Jodrell
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接