2014-10-03 78 views
0

我試圖找出如何從tmx文件(即XML文件)獲取已翻譯的內存。c#如何通過使用Xpath從XML文件中獲取特定值

這是我正在處理的tmx文件的摘錄。

<tmx> 
<body> 
    <tu tuid="1"> 
    <tuv xml:lang="en-US"> 
    <seg>Memory</seg> 
    </tuv> 
    <tuv xml:lang="ar"> 
    <seg>XXXXX</seg> 
    </tuv> 
    </tu> 
    <tu tuid="2"> 
    <tuv xml:lang="en-US"> 
    <seg>Address</seg> 
    </tuv> 
    <tuv xml:lang="ar"> 
    <seg>yyyyy</seg> 
    </tuv> 
    </tu> 
// 
<body> 
<tmx> 

什麼我試圖做的是搜索「賽格」裏面一個特定的值,然後拿到下一個「賽格」內的相應值。

在上面的例子,如果我在尋找

​​

然後,我需要找回

<seg>xxxxx<seg> 

我的編碼是這樣的。

DataRow[] searchWordsArray = keyStrings.ToArray(); 
XmlNodeList nodelist = doc.SelectNodes("//body//tu"); 

for (int i = 0; i < searchWordsArray.Length; i++){ 
    for (int n = 0; n < nodelist.Count; n++) { 

     string searchWord = searchWordsArray[i][KeyCol].ToString(); 
     string result = ""; 
     if (searchWord == nodelist[n].SelectSingleNode("/tuv[1]/seg").InnerText) { 
      result = nodelist[n].SelectSingleNode("/tuv[2]/seg").InnerText; 
     } else { 
      result = "No match"; 
     } 
    } 
} 

然而,這個代碼在

if (searchWord == nodelist[n].SelectSingleNode("/tuv[1]/seg").InnerText) { 

我想我的XPath表達式包含了一些錯誤得到空引用異常。 我會很感激,如果你會給任何見解。

+0

XPath表達式是完全正常的。他們只是不選擇你提供的任何XML。查看任何XPath引用或快速入門(例如[MSDN上的Xpath示例](http://msdn.microsoft.com/zh-cn/library/ms256086%28v=vs.110%29.aspx))以確認比tyou正確理解XPath中'/'和'//'的區別。 – 2014-10-03 04:53:31

+0

你已經在'tu'節點了,所以不要執行'/ tuv [x]/...'。改用'tuv [x]/...'。正如阿列克謝提到的那樣,請閱讀'/'和'//'做些什麼。 – TyCobb 2014-10-03 05:16:59

+0

您的xml無效,tmx和body標籤沒有結束標籤。如果你的意思是底部的兩個標籤是他們... – 2014-10-03 09:28:11

回答

0

您需要添加前導點(.刪除了XPath的領先斜線(/)被確認爲相對路徑:

if (searchWord == nodelist[n].SelectSingleNode("./tuv[1]/seg").InnerText) { 
    result = nodelist[n].SelectSingleNode("./tuv[2]/seg").InnerText; 
} 

if (searchWord == nodelist[n].SelectSingleNode("tuv[1]/seg").InnerText) { 
    result = nodelist[n].SelectSingleNode("tuv[2]/seg").InnerText; 
} 
+0

非常感謝你......我修好了!:) – Hiroki 2014-10-04 08:48:29

0

您是否必須使用XPath?

使用LINQ到XML

XElement root = XElement.Load(file); 
var segs = root.Descendants("seg"); 
XElement check = null; 
var resultNode = segs.FirstOrDefault(x => 
{ 
    if ((string)check == "Memory") 
     return true; 
    check = x; 
    return false; 
}); 
string result = (string)resultNode; 
相關問題