如何在C#中基于多个属性查找XElement的Descendant节点
多属性定位XML节点的C#实现示例
多条件匹配节点的查询逻辑优化
原代码仅通过_PatientName子元素匹配_PATIENTDETAILS节点,要加入_PatientAccNo、_HicNo、_MedRecNo三个子元素作为匹配条件,只需扩展Where中的判断逻辑即可。假设你已持有对应字段的目标值(如currentPatientAccNo、currentHicNo、currentMedRecNo),修改后的查询代码如下:
// 定义需要匹配的所有目标字段值 string currentPatientName = "目标患者姓名"; string currentPatientAccNo = "目标患者账号"; string currentHicNo = "目标HIC编号"; string currentMedRecNo = "目标病历号"; // 多维度精准匹配_PATIENTDETAILS节点 XElement patient = xmlDoc.Descendants(ns + "_PATIENTDETAILS") .FirstOrDefault(x => (string)x.Element(ns + "_PatientName") == currentPatientName && (string)x.Element(ns + "_PatientAccNo") == currentPatientAccNo && (string)x.Element(ns + "_HicNo") == currentHicNo && (string)x.Element(ns + "_MedRecNo") == currentMedRecNo);
修正后续元素添加逻辑
原后续代码存在两处逻辑问题,需同步调整:
patient.Element("_PATIENTDETAILS"):patient本身就是定位到的_PATIENTDETAILS节点,无需再次查找其子节点xmlDoc.Element("_OCROUTPUT").Element("_PATIENTDETAILS"):直接取根节点下的_PATIENTDETAILS会跳过你精准定位的目标节点,应直接使用已找到的patient节点操作
修正后的添加代码示例:
if (patient != null) // 先判断节点是否找到,避免空引用异常 { patient.Add(new XElement(ns + "_SERVICELINES", new XElement(ns + "字段名1", "对应数据"), new XElement(ns + "字段名2", "对应数据") // 按需添加其他子元素 )); }
关键注意点
- 所有子元素名称必须带上命名空间
ns,避免因命名空间不匹配导致查找或添加失败 - 若部分字段允许空值匹配,可调整判断逻辑(比如使用
string.Equals并指定忽略大小写,或增加空值兼容判断)
内容的提问来源于stack exchange,提问作者Rich Petersen
相关产品推荐
相关产品推荐

