0

在一个项目中,我正在读取 XML 文件以获取字符串数据。它工作得很好,但有一个例外。下面是 XML 文件的结构:

<Table>
    <row>
       <queryId>customAnalyticsParam</queryId>
       <queryStatement>
       1|-1|-1|-1
       </queryStatement>
    </row>
</Table>

表格标签包含多个行标签。每个行标签由 queryId 标签区分。上面的结构与以下代码配合得很好:

string query = "";
XmlDocument xd = new XmlDocument();
xd.Load(xml_query_filePath);
XmlNode xnode = xd.SelectNodes("/Table/row/queryId[.='" + id.Trim() + "']")[0];
query = xnode.NextSibling.NextSibling.InnerText;

在上面的代码中,第三行 id 是函数参数中提供的 queryId。当 XML 采用以下格式时会出现异常:

<Table>
   <row>
      <queryId>
      customAnalyticsParam
      </queryId>
      <queryStatement>
      1|-1|-1|-1
      </queryStatement>
   </row>
</Table>

那是 queryId 节点中前后的行空间。由于这些换行空格,代码找不到节点并返回 null。

请帮我想办法。

谢谢

4

2 回答 2

3

尝试使用normalize-space

XmlNode xnode = xd.SelectNodes("/Table/row/queryId[normalize-space(.)='" + id.Trim() + "']").[0];
于 2013-08-23T09:29:39.520 回答
0

您还可以通过简单的Trim()方法使用 LINQ to XML 来删除空格

var xdoc = XDocument.Load(xml_query_filePath);
var statements = from r in xdoc.Descendants("row")
                 let queryId = (string)r.Element("queryId")
                 let statement = (string)r.Element("queryStatement")
                 where queryId.Trim() == id.Trim()
                 select statement.Trim();

或者,如果您只需要第一个语句(请注意,在您的代码中,元素应该存在于 xml 中)

var statement = xdoc.Descendants("row")
                    .First(r => r.Element("queryId").Value.Trim() == id.Trim())
                    .Element("queryStatement").Value.Trim();
于 2013-08-23T09:51:26.680 回答