2016年8月8日 星期一

【C#】SelectNodes(...) return empty list at specific xml file

跑某個 .config 檔時 SelectNodes(...) 完全讀不到節點,但輸入路徑正確且 ChildNodes 也有值。

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
裡面的第一個 xmlns 沒有 xmlns:xsi 這樣的別名,所以解決方法要嘛,把它補上 xmlns:xsd 之類的,要嘛就要在程式跑的過程裡面加回去,像
XmlElement _root;
XmlDocument _xd = new XmlDocument();
_xd.Load(@"NLog.config");
_root = _xd.DocumentElement;
var xmlNamespaces = _root.Attributes.Cast<XmlAttribute>().Where(attr => attr.Name.Contains("xmlns"));
var incompleAttr = xmlNamespaces.FirstOrDefault(ns => ns.Name == "xmlns");
IEnumerable<XmlElement> range = null;
XmlNamespaceManager nsmgr = null;
if (incompleAttr != null) {
    nsmgr = new XmlNamespaceManager(_xd.NameTable);
    nsmgr.AddNamespace("xsd", incompleAttr.InnerText);
    range = _root.SelectNodes(@"xsd:rules/xsd:logger", nsmgr).Cast<XmlElement>();
}
else {
    range = _root.SelectNodes(@"rules/logger").Cast<XmlElement>();
}

特別注意每一層都要加 rules/logger 就會變成 xsd:rules/xsd:logger。

ref: SOFdevioblog

沒有留言:

張貼留言