如何在C#中使用XDocument读取XML中的<?Insert-Table?>标签
如何用XDocument读取XML中的处理指令(PI)
你碰到的<?Insert-Table ID="hebz-9780192893512-chapter-1-tableGroup-1"?>不是普通XML元素,而是XML处理指令(Processing Instruction,简称PI)。XDocument能正常加载这类节点,但不能用读取普通元素的方法(比如Elements())获取,得专门针对PI节点处理。
具体实现步骤
- 加载XML文档:用
XDocument.Load()或XDocument.Parse()加载文件,PI节点会被完整保留在文档结构里。 - 筛选PI节点:遍历文档的所有节点,筛选出
XProcessingInstruction类型的对象,再根据目标名称(比如Insert-Table)过滤。 - 解析PI参数:PI的属性内容存在
Data属性里,需要自己解析(比如用正则或字符串处理)提取ID这类参数。
代码示例
// 加载XML文档 XDocument doc = XDocument.Load("你的XML文件路径.xml"); // 筛选所有Insert-Table类型的处理指令 var insertTablePIs = doc.DescendantNodes() .OfType<XProcessingInstruction>() .Where(pi => pi.Target == "Insert-Table"); // 遍历并解析每个PI的ID参数 foreach (var pi in insertTablePIs) { // 用正则匹配ID属性值 var idMatch = System.Text.RegularExpressions.Regex.Match(pi.Data, @"ID=""([^""]+)"""); if (idMatch.Success) { string tableId = idMatch.Groups[1].Value; Console.WriteLine($"找到Insert-Table,ID: {tableId}"); } }
补充说明
XProcessingInstruction.Target:对应<?后面的指令名称(比如这里的Insert-Table)。XProcessingInstruction.Data:存储指令后的所有属性内容,因为PI没有严格的XML属性规范,所以需要自己解析参数。如果参数格式固定,也可以写简单的字符串分割逻辑替代正则。- 如果需要创建或修改PI,直接实例化
XProcessingInstruction对象(比如new XProcessingInstruction("Insert-Table", "ID=\"new-table-id\"")),再添加到文档的对应节点下即可。
内容的提问来源于stack exchange,提问作者dilipkumar duppala
相关产品推荐
相关产品推荐

