导航

Linq 读取 XML 注意事项

Posted on 2020-12-04 11:21  ccjvl  阅读(116)  评论(0编辑  收藏  举报

读取XML的时候首先要注意BOM问题:

以下为解决方案:

string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
    xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}

 

 

另外需要注意,获取node value的时候需要加上namespace:

参考:Linq to XML 之XElement的Descendants方法的新发现 - 天外飞雨 - 博客园 (cnblogs.com)

    XElement docX = XElement.Load(xmlName);
    
//    var parentNode = "Folder";
    var childNode = docX.Name.Namespace + "Name";
//    var childNodeValue = "10.9.1.1.1 Trigger Driver SW open";
//    var tagetNodeValue = "ECU shall receive the trigger \"Driver_open_switch\"";
    var childNodeValue = groutName;
    var tagetNodeValue = itemName;
    var targetNode = docX.Name.Namespace + "TraceItem";
    var targetAttrib = docX.Name.Namespace + "UniqueID";
        
    XElement eleName = docX.Descendants(childNode).Where(itm => itm.Value == childNodeValue).First();//Find the element of <Name> which the value is childNodeValue        
    XElement xe = eleName.Parent;//Get the parent node    
    XElement eleTarget = xe.Descendants(childNode).Where(itm => itm.Value == tagetNodeValue).First();//Find the element of <Name> which the value is tagetNodeValue
    XElement xeP = eleTarget.Parent;//Get the parent node    
    XElement xeTarg = xeP.Descendants(targetAttrib).First();
    
    currPath1.Value = eleName.ToString();
    currPath2.Value = xe.ToString();
    currPath3.Value = xeTarg.ToString();
    
    id = int.Parse(xeTarg.Value.Replace("4999_2-",""));
    TmpReqID.Value=id;