2011-03-22 59 views
0

我有具有天城文到itrans映射兩個XML文件,這些文件是dev.xml 和gujarati.xml。 xml文件內容如下:卡在for循環中!

爲guj.xml是:

<mapping> 
    <character>અ</character> 
    <itrans>a</itrans> 
</mapping> 

和dev.xml是

<mapping> 
    <character>अ</character> 
    <itrans>a</itrans> 
</mapping> 

我有有一個Global.asax文件以下代碼:

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Web; 
using System.Web.Security; 
using System.Web.SessionState; 
using System.Xml.Linq; 
using System.Xml; 

namespace finAL 
{ 
    public class Global : System.Web.HttpApplication 
    { 

     protected void Application_Start(object sender, EventArgs e) 
     { 
      sbyte[,] d = new sbyte[100, 100]; 
      sbyte[,] g = new sbyte[100, 100]; 
      int count = 0; 
      int j = 0; 

      XmlDocument docA = new XmlDocument(); 
      StreamReader sr = new StreamReader("dev.xml"); 
      docA.Load(sr); 

      XmlDocument docB = new XmlDocument(); 
      StreamReader sr1 = new StreamReader("guj.xml"); 
      docB.Load(sr1); 

      XmlNodeList elemlist1 = root.GetElementsByTagName("mapping"); 
      XmlNodeList elemlist2 = root.GetElementsByTagName("mapping"); 
      XmlNodeList X; 

      for (int i = 0; i < elemlist1.Count; i++) 
      { 
       X = elemlist1[i].GetElementsByTagName("itrans"); 
       d[i][0] = X[0].firstchild.data; 


       X = elemlist1[i].GetElementsByTagName("character"); 
       d[i][1] = X[0].firstchild.data; 
      } 

      for (int i = 0; i < elemlist2.Count; i++) 
      { 
       X = elemlist1[i].GetElementsByTagName("itrans"); 
       g[i][0] = X[0].firstchild.data; 

       X = elemlist1[i].GetElementsByTagName("character"); 
       g[i][1] = X[0].firstchild.data; 
      } 

      Session("dtable") = d; 
      Session("gtable") = g; 
     } 
    } 
} 

此處的代碼從兩個xml文件中讀取並將字符存儲在二維數組中。此數組isfurther存儲在會話變量,這樣我可以Default.aspx中

Default.aspx文件包含下面的代碼訪問它。

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml; 

namespace finAL 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      sbyte[,] TableD = new sbyte[100, 100]; 
      sbyte[,] TableG = new sbyte[100, 100]; 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml("<div>" & Request.Form("inTransContent") & "</div>"); 
      XmlNodeList nodeList; 
      nodeList = doc.DocumentElement.SelectNodes("//text()"); 
      TableD = Session("dtable"); 
      TableG = Session("gtable"); 
      String str=tmpNode.data; 
      str.ToCharArray(); 
      foreach (XmlText tmpNode in nodeList) 
      { 

      } 
      Response.Write(doc.DocumentElement.InnerXml); 
     } 
    } 
} 

這裏intranscontent包含帶div元素的網頁。 所以我選擇他們的textnodes。在這段代碼中,我訪問global.asax中的session變量,將節點轉換爲字符串,然後chararray,以便我可以將devanagri的字符替換爲古吉拉特語。

在for循環中,我需要檢查每個devanagri字符是否記住所有音譯規則的等價古吉拉特字符。音譯規則就像前一個字母是元音那麼它應該只輸出元音。如果任何人都可以幫助我這個循環,我會感謝他們。謝謝!任何查詢免費發佈。

+1

首先你應該考慮重構你的代碼。將您的變量重命名爲更有意義的名稱。這將有助於發現錯誤,即使在幾個月內你也能夠理解你的代碼。 – Zebi 2011-03-22 08:28:32

+0

'如果前一個字母是元音,那麼它應該只輸出元音' - 這聽起來很奇怪,你能用其他方式來描述嗎? – 2011-03-22 11:17:48

+0

काम是在印地文,所以在itrans是kaam,所以在印地文क表示爲k和一個表示爲अ但是當你檢查下一個字符再次是字母A,所以一旦你確認信其有它解釋爲AA映射到आ..如果你瞭解你印地文很容易得到它,也有一些音譯規則,問題是,它必須檢查的未來角色是否是元音或長輔音!如果它是一個元音,它必須使用一些不同的音譯規則,如果它是一個輔音,它必須使用其他的東西。 – vin 2011-03-22 14:10:35

回答

0

如果itrans確實是一個唯一的標識符,我很懷疑,在梵文和古吉拉特語字符之間,那麼我會建議創建一個Dictionary<char,char>而不是一個數組。

var gujarati = "<mappings><mapping><character>અ</character><itrans>a</itrans></mapping><mapping><character>ત</character><itrans>i</itrans></mapping></mappings>"; 
var devanagri = "<mappings><mapping><character>अ</character><itrans>a</itrans></mapping><mapping><character>र</character><itrans>i</itrans></mapping></mappings>"; 

var gujDict = XDocument.Parse(gujarati). 
       Descendants("mapping"). 
       ToDictionary(ele => ele.Element("itrans").Value[0], ele => ele.Element("character").Value[0]); 
var devDict = XDocument.Parse(devanagri). 
       Descendants("mapping"). 
       ToDictionary(ele => ele.Element("itrans").Value[0], ele => ele.Element("character").Value[0]); 

var devToGuj = new Dictionary<char, char>(); 

foreach (var c in devDict) 
{ 
    char dev; 
    if (gujDict.TryGetValue(c.Key, out dev)) 
     devToGuj.Add(c.Value, dev); 
} 

然後你只需要devToGuj['અ']即可獲得相應的字符。要替換字符串中的字符,你可以這樣做。

var devText = "अ quरck test."; 
var gujText = String.Join("", 
        devText.ToArray(). 
        Select(c => devToGuj.ContainsKey(c) ? devToGuj[c] : c) 
        ); 

=> 「અ曲તCK測試」。

+0

我不想用linq !!我想訪問xml文件,在這裏它會打開並使用streamreader讀取,然後將其存儲在一個二維數組中,該數組將存儲在會話對象中。 – vin 2011-03-22 16:32:45

+0

難道你不想使用LINQ或不能使用它,因爲你仍然在.NET 2.0土地?你有什麼問題與LINQ? – 2011-03-22 19:57:40

+0

另外,我提出的查找與LINQ無關,但只是一個簡單的字典查找。如果性能非常重要,則應該測試存儲它們的不同方式,因爲對於集合中的少量項目,列表或者數組實際上比字典更快,即使字典非常接近O(1)。 – 2011-03-22 19:58:05