XML и Hashtable - PullRequest
       4

XML и Hashtable

0 голосов
/ 25 января 2012

У меня есть следующий XML-файл:

    <states>
      <state>
        <Name>a1</Name>
        <Address>a2</Address>
        <Name>b1</Name>
        <Address>b2</Address>
        <Name>c1</Name>
        <Address>c2</Address>
      </state>
      <state>
        <Name>aa1</Name>
        <Address>aa2</Address>
        <Name>bb1</Name>
        <Address>bb2</Address>
      </state>
    </states>

Мне нужно сохранить его в хеш-таблице и извлечь из него значения, используя C #.

Может кто-нибудь помочь мне в этом?

1 Ответ

2 голосов
/ 25 января 2012

Я согласен с Джоном Скитом.Это был бы более структурированный подход для упаковки информации, относящейся к одному и тому же человеку, в одну, скажем, <Person> сущность.И вы также должны дать какое-то имя или удостоверение личности каждому штату;в противном случае ваши группировки выглядят произвольно.

<states>
  <state Name="Florida">
    <Person Name="a1">
       <Address>a2</Address>
    </Person>
    <Person Name="b1">
       <Address>b2</Address>
    </Person>
    <Person Name="c1">
       <Address>c2</Address>
    </Person>
  </state>
  <state Name="New York">
    <Person Name="aa1">
       <Address>aa2</Address>
    </Person>
    <Person Name="bb1">
       <Address>bb2</Address>
    </Person>
  </state>
</states>

Вот как вы можете построить двухуровневый словарь.Внешний словарь определяется по имени штата и оценивается словарем, содержащим людей, проживающих в этом штате.Внутренний словарь вводится по имени человека и оценивается по его адресу.

XDocument document = XDocument.Parse(@"
    <states>
      <state Name=""Florida"">
        <Person Name=""a1"">
            <Address>a2</Address>
        </Person>
        <Person Name=""b1"">
            <Address>b2</Address>
        </Person>
        <Person Name=""c1"">
            <Address>c2</Address>
        </Person>
      </state>
      <state Name=""New York"">
        <Person Name=""aa1"">
            <Address>aa2</Address>
        </Person>
        <Person Name=""bb1"">
            <Address>bb2</Address>
        </Person>
      </state>
    </states>");

IDictionary<string, Dictionary<string, string>> dictionary =                
    document.Root.Elements("state").ToDictionary(
        state => state.Attribute("Name").Value,
        state => state.Elements("Person").ToDictionary(
            person => person.Attribute("Name").Value,
            person => person.Element("Address").Value));

// To get address of "a1" living in Florida:
string addr1 = dictionary["Florida"]["a1"];      // gives "a2"

// To get address of "bb1" living in New York:
string addr2 = dictionary["New York"]["bb1"];    // gives "bb2"

Таким образом, чтобы получить адрес человека X, проживающего в городе C, вам просто нужно получить доступdictionary[C][X].

Редактировать : Ответить на комментарий:

Вы можете изменить имя человека, сначала удалив его запись (из внутреннего словаря), а затем повторнодобавив его (с новым именем в качестве ключа).

Например, чтобы изменить имя "aa1" на "aa2":

Dictionary<string, string> innerDictionary = dictionary["New York"];
string address = innerDictionary["aa1"];
innerDictionary.Remove("aa1");
innerDictionary.Add("xx1", address);

Тем не менее, Dictionary<TKey, TValue> можетне самая лучшая структура, если вам часто приходится менять ключи.

...