Comment lire CodeTables de plusieurs dans le formulaire XML
-
27-10-2019 - |
Question
Je dispose de plusieurs tables de codes au bas du document XML que je suis en train de traiter et je voudrais rechercher un code qui vient de la partie supérieure du XML et obtenir le codetext d'une table au fond du XML.
Voici deux des CodeTables:
<CodeTable Name="Codes - Days of Week">
<CodeText CodeValue="" />
<CodeText CodeValue="1">SUNDAY</CodeText>
<CodeText CodeValue="2">MONDAY</CodeText>
<CodeText CodeValue="3">TUESDAY</CodeText>
<CodeText CodeValue="4">WEDNESDAY</CodeText>
<CodeText CodeValue="5">THURSDAY</CodeText>
<CodeText CodeValue="6">FRIDAY</CodeText>
<CodeText CodeValue="7">SATURDAY</CodeText>
</CodeTable>
<CodeTable Name="Codes - Bus Type">
<CodeText CodeValue="" />
<CodeText CodeValue="0">NOT A BUS</CodeText>
<CodeText CodeValue="1">SCHOOL (PUBLIC OR PRIVATE)</CodeText>
<CodeText CodeValue="2">TRANSIT</CodeText>
<CodeText CodeValue="3">INTERCITY</CodeText>
<CodeText CodeValue="4">CHARTER</CodeText>
<CodeText CodeValue="5">OTHER</CodeText>
</CodeTable>
Je suis en mesure d'utiliser les lignes de code ci-dessous pour se rendre à la table de code:
string CodeTableName = "Codes - Days of Week";
XmlNode CodeTableNode = doc.SelectSingleNode("//CodeTable[@Name=\"" + Convert.ToString(CodeTableName) + "\"]");
Et j'ai été en mesure d'utiliser ce qui suit pour obtenir le codetext pour le type de bus = 0:
XmlNode CodeTextNode = doc.SelectSingleNode("//CodeText[@CodeValue=\"" + Convert.ToString(BusCode) + "\"]");
code_text = CodeTextNode.InnerText;
Console.WriteLine(code_text);
Ce que je voudrais être en mesure de faire est de mettre ces deux ensemble en quelque sorte? Je peux donc aller à la table des codes que j'ai besoin puis tirer le codetext correct sur la base CodeValue.
La solution
Si vous utilisez LinqToXml vous pouvez faire ce qui suit:
using System.Linq;
using System.Xml.Linq;
// [...]
var codeKey = "0";
var name = "Codes - Bus Type";
var doc = XDocument.Load("bla");
var code = doc.Descendants().Where(
d => d.Name == "CodeText" &&
d.Parent.Attribute("Name").Value == name &&
d.Attribute("CodeValue").Value == codeKey).FirstOrDefault().Value;
Dans le code productif je voudrais vous assurer que vous vérifiez d'abord pour null
avant le dernier appel .Value
. Mais sinon, cela devrait fonctionner.