【问题标题】:c# How to get specific values from XML files by using Xpathc# 如何使用 Xpath 从 XML 文件中获取特定值
【发布时间】:2014-10-03 04:42:42
【问题描述】:

我正在尝试找出如何从 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>

我正在尝试做的是在“seg”中搜索特定值,然后在下一个“seg”中获取相应的值。

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

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

【问题讨论】:

  • 您的 XPath 表达式非常好。他们只是不选择您提供的 XML 中的任何内容。查看任何 XPath 参考或快速入门(即 Xpath Examples on MSDN )以确认您是否正确理解 XPath 中 / 和 // 之间的区别。
  • 您已经在tu 节点中,所以不要使用/tuv[x]/...。请改用tuv[x]/...。正如阿列克谢所提到的,请阅读 / 和 // 所做的事情。
  • 您的 xml 无效,tmx 和 body 标签没有结束标签。如果您的意思是底部的两个标签是它们...

标签: c# xml xpath


【解决方案1】:

您需要添加前导点 (.) 或删除前导斜杠 (/) 才能将 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;
}

【讨论】:

  • 非常感谢...我修好了!:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2015-08-22
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多