C#中用LINQ查询XML,定位指定paraId的<w:tr>下的<w:p>标签
解决C# LINQ to XML解析Word文档的问题
首先要注意Word XML的命名空间,直接用"w:tr"这类字符串无法匹配节点,必须先定义对应的命名空间:
// 定义Word XML的标准命名空间 XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; // 定义Office 2010扩展的命名空间(对应w14前缀) XNamespace w14 = "http://schemas.microsoft.com/office/word/2010/wordml";
步骤1:定位目标<w:tr>节点并提取内部<w:p>节点
以下是完整的LINQ查询代码,实现筛选w14:paraId="12345"的<w:tr>,并提取其内部所有<w:p>节点:
XDocument xdc = XDocument.Parse(docText); // 筛选符合条件的tr节点,再提取其内部所有p节点 var targetParagraphs = xdc.Root .Descendants(w + "tr") .Where(tr => tr.Attribute(w14 + "paraId")?.Value == "12345") .SelectMany(tr => tr.Descendants(w + "p")) .ToArray();
步骤2:将<w:p>节点序列化为字符串
如果需要把每个<w:p>节点转换为XML字符串,直接遍历数组调用ToString()即可:
// 转换为XML字符串数组 string[] pNodeStrings = targetParagraphs.Select(p => p.ToString()).ToArray();
代码说明
w + "tr":通过命名空间拼接节点名,正确匹配Word XML中的<w:tr>节点Where(tr => tr.Attribute(w14 + "paraId")?.Value == "12345"):精准筛选带有指定w14:paraId属性的tr节点SelectMany(tr => tr.Descendants(w + "p")):从符合条件的tr节点中提取所有后代p节点(因为p通常嵌套在<w:tc>内部)
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

