застрял в цикле для C #! - PullRequest
       17

застрял в цикле для C #!

0 голосов
/ 22 марта 2011

у меня есть два xml-файла, которые имеют привязку devanagri к itrans, это файлы dev.xml и gujarati.xml. Содержимое XML-файла выглядит следующим образом:

для 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 и сохраняет символы в двухмерном массиве. Этот массив в дальнейшем сохраняется в переменной сеанса, чтобы я мог получить к нему доступ по умолчанию .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);
        }
    }
}

здесь интрансконтент содержит веб-страницу с элементом div. поэтому я выбираю текстовые узлы из них. В этом коде я обращаюсь к переменной сеанса, которая была в global.asax, узлы преобразуются в строки, а затем в chararray, чтобы я мог заменить символы деванагри на гуджарати.

В цикле for мне нужно проверить для каждого символа деванагри эквивалентный символ гуджарати, учитывая все правила транслитерации. Правила транслитерации аналогичны, если предыдущий символ гласный, тогда он должен выводить только гласный. Если кто-то может помочь мне с этим для цикла, я буду им благодарен Спасибо! Любые вопросы, пожалуйста, оставьте бесплатно.

1 Ответ

0 голосов
/ 22 марта 2011

Если 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)
                    );

=> "અ qu ત ck test."

...