2011-11-03 97 views
2

我是XML新手,现在正在尝试读取xml文件。 我GOOGLE了,并尝试这种方式来阅读XML,但我得到这个错误。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,&在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解析实体? 我喜欢在网上参考,因为他们可能随时添加新的。 在此先感谢!

+0

XML是无效的,它需要被修改以删除或转义&,你会努力阅读它的XML直到你做。 –

+0

使用&或&而不是& – Prasanth

+0

所以你的意思是使用&是一个大问题,不应该使用它? 我的问题是我从其他开发人员那里得到这个XML,我不知道。我的另一个问题是我不能告诉他们修改它。我该怎么办。 Thx的答复! – kevin

回答

2

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

+0

Ccaron是'&#x010C;'btw。如果没有定义,我会解释我想要的字符。 –

+0

它应该如何定义?什么是&#x010C? Thx – kevin

+0

Thx我看到如何定义。 :D – kevin

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); 
+0

你需要阅读你的文本文件,然后使用Encoding.UTF8.GetBytes(xml);概念是你需要编码你的字符串。 – ratneshsinghparihar

+0

*** byte [] encodedString = Encoding.UTF8.GetBytes(xml); MemoryStream ms = new MemoryStream(encodedString); ms.Flush(); ms.Position = 0; *** 我试过这样但同样的错误。 – kevin

+0

你可以把你的整个班级 – ratneshsinghparihar

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

因为我必须从外国获取XML,所以我不能这样做。 他们会为我生成XML。 我该怎么办? – kevin

1

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

但是,that entity must be declared或XML解析器在分析XML时不会知道应该用什么替代实体引用。

3

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

由于您是XML新手,我会猜测定义的实体并不是您之前遇到过的。字符实体是任意文本块(一个或多个字符)的快捷方式。你将要看到的最常见的地方就是你现在处于的状态。在某些时候,你的XML是由想要输入字符'Č'或'č'(如果你的字体无法显示它的话,用Caron写的大写和小写C)创建的。

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

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

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

配售该声明在XML文件的开头(改“根元素”来匹配你的)将允许解析器解析的实体。

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

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

您可以随时键入字符,但需要了解键盘和区域的来龙去脉。

+0

Thx为您的答案。我没有看到他们宣布该实体。我应该申报吗?我在哪里可以找到那个&Ccaron是字符'Č'或'č'?因为我在XML文件中看到其他**(&amp;,&lstrok;)**像&CCaron。 – kevin

+0

我仍然不能在它定义的地方。 – kevin

+0

嗨凯文。你的问题是它没有被定义。我会猜测它是大写版本,因为正常的约定是让它们匹配大小写。其他实体是否有任何定义?如果是这样,把宣言放在那里。如果在那里没有任何辩解,你可能会遇到与其他问题类似的问题。 XML文件的顶部是否有DTD语句? –