xml和&问题

时间:2011-11-03 10:02:02

标签: c# xml xmldocument

我是XML的新手,我现在正在尝试读取xml文件。 我用Google搜索并尝试这种方式来读取xml,但是我收到了这个错误。

  

参考未宣布的实体'Ccaron'。第2902行,第9位。

当我去2902行时,我得到了这个,

<H0742>&Ccaron;opova 14, POB 1725,
SI-1000 Ljubljana</H0742>

这是我尝试的方式

XmlDocument xDoc = new XmlDocument();
xDoc.Load(file);
            XmlNodeList nodes = xDoc.SelectNodes("nodeName");
            foreach (XmlNode n in nodes)
            {
if (n.SelectSingleNode("H0742") != null)
                {
                    row.IrNbr = n.SelectSingleNode("H0742").InnerText;
                }
                .
                .
                .
            }

当我看到w3school时, &amp;在xml中是非法的

编辑: 这是编码。我不知道它与xml有什么关系。

  

编码= 'ISO-8859-1'

提前致谢。

编辑:

他们给了我一个 .ENT 文件,我可以在线参考ftp.MyPartnerCompany.com/name.ent。 在这个.ENT文件中 我看到像这样的实体

<!ENTITY Cacute "&#262;"> <!-- latin capital letter C with acute,
                                  U+0106 Latin Extended-A -->

如何在我的xml解析中引用它? 我更喜欢在线参考,因为他们可以随时添加新内容。 在此先感谢!!!

5 个答案:

答案 0 :(得分:3)

首先要注意的是问题不在您的软件中。

由于您不熟悉XML,我猜猜定义实体不是您之前遇到过的。字符实体是任意文本片段(一个或多个字符)的快捷方式。您将看到它们最常见的地方就是您现在所处的情况。在某些时候,您的XML是由想要输入字符'Č'或'č'的人创建的(如果您的字体无法显示,则使用Caron的大写和小写C)。

然而,在XML中我们只有几个预先声明的实体(&符号,小于,大于,双引号和撇号)。需要声明任何其他字符实体。为了正确解析您的文件,您需要执行以下两项操作之一 - 将字符实体替换为不会导致解析器发布的内容或声明实体。

要声明实体,您可以使用称为“内部子集”的东西 - 您可能在XML文件顶部看到的DTD语句的特殊形式。像这样:

<!DOCTYPE root-element 
   [ <!ENTITY Ccaron "&#x010C;">
     <!ENTITY ccaron "&#x010D;">]
>

将该语句放在XML文件的开头(更改'root-element'以匹配你的文件)将允许解析器解析实体。

或者,只需将&Ccaron;更改为&#x010C;,您的问题也将得到解决。

&#表示法是一个数字实体,为字符提供适当的unicode值('x'表示它是十六进制的。)

您也可以随时输入字符,但需要了解键盘和区域的细节。

答案 1 :(得分:2)

&Ccaron;不是XML,甚至没有在HTML 4实体引用中定义。哪个btw不是XML。 XML不支持所有这些实体,事实上,它只支持很少的实体,但是如果你查找实体并找到它,你就可以使用它的Unicode等价物,你可以使用它。例如&Scaron;是无效的XML,但&#352;不是。 (Scaron是我能找到Ccaron}的最接近的地方。

答案 2 :(得分:1)

您的XML文件格式不正确,因此不能用作XmlDocument。周期。

您有两种选择:

  • 将该文件作为常规文本文件打开并修复该症状。
  • 修复您的XML生成器,这是您真正的问题。该生成器不使用System.Xml生成该文件,但可能会连接多个字符串,因为“XML只是一个文本文件”。您应该修复它,或者打开生成的XML文件总是一件令人意外的事。

编辑:由于无法修复XML生成器,我建议使用File.ReadAllText打开它并执行正则表达式重新编码&或者剥离整个实体(因为我们无法翻译)

Console.WriteLine(
    Regex.Replace("<H0742>&Ccaron;opova 14, &#123; POB & SI-1000 &amp;</H0742>",
    @"&((?!#)\S*?;)?", match =>
    {
        switch (match.Value)
        {
            case "&lt;":
            case "&gt;":
            case "&amp;":
            case "&quot;":
            case "&apos;":
                return match.Value; // correctly encoded

            case "&":
                return "&amp;";

            default: // here you can choose:
                // to remove entire entity:
                return "";
                // or just encode that & character
                return "&amp;" + match.Value.Substring(1);
        }
    }));

答案 3 :(得分:1)

&Ccaron;是实体参考。实体引用很可能是针对字符Č,以便生成:Čopova

但是,that entity must be declared或XML解析器在解析XML时不知道应该替换实体引用的内容。

答案 4 :(得分:0)

解决方案: -

 byte[] encodedString = Encoding.UTF8.GetBytes(xml);
    // Put the byte array into a stream and rewind it to the beginning 
        MemoryStream ms = new MemoryStream(encodedString);
         ms.Flush();    
     ms.Position = 0;     
     // Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes 
    XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(ms);