从处理指令行读取XML属性

时间:2015-11-04 06:59:20

标签: c# xml xpath attributes processing-instruction

我在XML文档中有以下行

<?ish ishref="GUID-XXXXXXXXXXXXXXXXXXXX" version="1" lang="ae" srclng="en"?>

并希望阅读(并修改)lang属性。我尝试过以下方法:

newXMLDoc.Load(XMLfile);
instruction = newXMLDoc.SelectSingleNode("/processing-instruction('ish')")
         as XmlProcessingInstruction;

instruction返回一个有效的对象,其innerText等于“it's”行,但我不知道如何访问属性(尝试了各种方法,但都返回null)

如何访问instruction的属性(或者是否有更好的访问方式)?

我尝试过类似“/ ish @ lang”和instruction.Attributes的XPath,但那些只返回NULL。

我更喜欢非LINQ解决方案,我使用的是.NET 4.5

1 个答案:

答案 0 :(得分:2)

Processing instruction只包含文本 - XML规范不对内容施加任何限制,也不对它们赋予任何结构。因此,要获取内部文本,只需使用Value属性:

var newXMLDoc = new XmlDocument();
newXMLDoc.LoadXml("<?ish t='v' u='v'?><R></R>");
var instruction = newXMLDoc.SelectSingleNode("/processing-instruction('ish')")
             as XmlProcessingInstruction;
Console.WriteLine(instruction.Value); // t='v' u='v'

解析结果值取决于PI的严格值。如果你知道价值观没有空格,那么空间和String.Split上的简单'='就足够了,否则一些更复杂的方法,可能需要写入RegEx。

如果格式相对固定或者您只需要替换某些内容 - string.Replace(或RegEx.Replace)可以有效:

  instruction.Value = instruction.Value.Replace("lang=\"ae\"", "lang=\"XX\"");