2015-11-04 5 views
1

J'ai la ligne suivante dans un document XMLattribut XML de lecture à partir d'une ligne d'instruction de traitement

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

et que vous souhaitez lire (et modifier) ​​l'attribut lang. Je l'ai essayé ce qui suit:

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

instruction retourné un objet valide avec le innerText égal à la ligne «il est », mais je ne sais pas comment accéder aux attributs (essayé de diverses manières, mais tous return null)

Comment accéder aux attributs de instruction (ou y a-t-il une autre façon d'améliorer l'accès)?

J'ai essayé XPath comme "/ ish @ lang" et instruction.Attributes mais ceux-ci retournent juste NULL.

je préférerais une solution non LINQ, j'utilise 4.5 .NET

+0

J'ai le pressentiment qu'une instruction de traitement ne fait pas - à savoir n'est pas définie à - avoir des attributs. Autrement dit, tout texte libre est autorisé entre les marques '', et ce n'est qu'une coïncidence que les gens placent habituellement quelque chose qui ressemble à des attributs. – millimoose

+1

En ce qui concerne tout analyseur conforme, le contenu d'un PI est juste une chaîne, et si vous voulez analyser les attributs, vous devez le faire vous-même. – millimoose

+1

Si vous voulez utiliser Saxon comme moteur XPath, alors il a une fonction d'extension 'saxon: getPseudoAttribute()' conçue pour faire ce travail. –

Répondre

2

Processing instruction contient seulement du texte - la spécification XML n'impose aucune restriction quant au contenu ni ne donne aucune structure pour eux. Donc, pour obtenir le texte intérieur vous utilisez juste Value propriété:

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' 

de valeur résultante Parsing dépend de la façon dont les valeurs strictes du PI sont. Un simple String.Split sur l'espace et sur '=' peut suffire si vous savez que les valeurs n'ont pas d'espaces, sinon une méthode plus complexe, peut-être que RegEx devrait être écrit.

Si le format est relativement fixe ou vous avez juste besoin de remplacer quelque chose - string.Replace (ou RegEx.Replace) pourrait fonctionner:

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

Je vois, oui, c'est un format assez fixe, je vais utiliser un string.split et une boucle sur eux. – Stefan