c#如何使用Xpath从XML文件中获取特定值

时间:2014-10-03 04:42:43

标签: c# xml xpath

我试图找出如何从tmx文件(即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>

我尝试做的是在&#34; seg&#34;中搜索特定值,然后在下一个&#34; seg&#34;中获取相应的值。

在上面的示例中,如果我正在寻找

<seg>Memory<seg>

然后,我需要检索

<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表达式包含一些错误。 如果你愿意提供任何见解,我将不胜感激。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

你必须使用XPath吗?

使用Linq-To-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;