我有两个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文件中读取并将字符存储在二维数组中。此数组进一步存储在会话变量中,以便我可以在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元素的网页。 所以我从中选择了文本节点。在这段代码中,我正在访问global.asax中的会话变量,节点被转换为字符串,然后转换为chararray,以便我可以将devanagri的字符替换为古吉拉特语。
在for循环中,我需要检查每个devanagri角色等同的古吉拉特角色,记住所有音译规则。音译规则就像前一个字符是元音一样,它应该只输出元音。如果有人能帮我解决这个问题,我会感谢他们。谢谢!任何查询都可以免费发布。
答案 0 :(得分:0)
如果itrans
确实是唯一的标识符,我怀疑在Devanagri和古吉拉特语字符之间,那么我建议创建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)
);
=&GT; “અquતck test。”