Как читать несколько CodeTables в форме XML - PullRequest
0 голосов
/ 02 мая 2011

У меня есть несколько таблиц кодов в нижней части XML-файла, который я обрабатываю, и я хотел бы найти код из верхней части XML и получить CodeText из таблицы в нижней части XML.

Вот два из кодовых таблиц:

<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>

Я могу использовать следующие строки кода для доступа к таблице кодов:

string CodeTableName = "Codes - Days of Week";
XmlNode CodeTableNode = doc.SelectSingleNode("//CodeTable[@Name=\"" + Convert.ToString(CodeTableName) + "\"]");

И я смог использовать следующее, чтобы получить CodeText для типа шины = 0:

XmlNode CodeTextNode = doc.SelectSingleNode("//CodeText[@CodeValue=\"" + Convert.ToString(BusCode) + "\"]");
code_text = CodeTextNode.InnerText;
Console.WriteLine(code_text);    

Что я хотел бы сделать, так это как-то соединить их? Так что я могу добраться до нужной мне CodeTable и затем вытащите правильный CodeText на основе CodeValue.

1 Ответ

0 голосов
/ 02 мая 2011

Если вы используете LinqToXml, вы можете сделать следующее:

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;

В продуктивном коде я должен убедиться, что вы сначала проверите null перед последним вызовом .Value.Но в противном случае это должно сработать.

...