2011-03-22 48 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