2011-11-03 65 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語句? –