Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c如何使用Xpath从XML文件中获取特定值_C#_Xml_Xpath - Fatal编程技术网

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

C# c如何使用Xpath从XML文件中获取特定值,c#,xml,xpath,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> </tu

我试图找出如何从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>
我想我的Xpath表达式包含一些错误。
如果您能提供任何见解,我将不胜感激。

您需要添加前导点。或者删除要识别为相对路径的XPath的前导斜杠/:

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


您必须使用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;

您的XPath表达式非常好。他们只是不选择您提供的XML中的任何内容。查看任何XPath参考或快速入门,即确认您正确理解XPath中/和//之间的差异。您已经在tu节点中,所以不要执行/tuv[x]/。。。。使用tuv[x]/。。。相反正如Alexei提到的,请仔细阅读/and//do。您的xml无效,tmx和body标记没有结束标记。如果你的意思是底部的两个标签…非常感谢你…我已经修好了!:
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) {
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;
}
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;