Добавить XmlNode в XmlElement - PullRequest
2 голосов
/ 30 мая 2011

Я получаю мыльный конверт от веб-службы с данными клиента, такими как имя, адрес и т. Д. Адрес не содержит город / пригород, но почтовый индекс.У меня есть все города и пригороды с их почтовыми индексами в файле CSV, поэтому я хочу вставить правильное название для каждого почтового индекса.Я могу сохранить его в базе данных или что-то еще, но это больше о том, как вставить узел перед передачей данных.

Код выглядит так:

XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(searchResponse);

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xDoc.NameTable);
nsmgr.AddNamespace("ns", wsNamespace);

XmlNodeList postCodeNodes = xDoc.SelectNodes("//ns:postcode", nsmgr);
string applicationPath = AppDomain.CurrentDomain.BaseDirectory;

foreach (XmlNode node in postCodeNodes)
{ 
    using (StreamReader readFile = new StreamReader(applicationPath + "postcodes.csv"))
    {
        string line;
        string[] row;

        while ((line = readFile.ReadLine()) != null)
        {
                row = line.Split(',');
                if (row[0].ToString() == node.InnerText)
                {
                    string suburb = row[1].ToString();
                    //XmlNode ndSuburb = xDoc.CreateElement("suburb");
                    //ndSuburb.Value = suburb;
                    //node.ParentNode.AppendChild(ndSuburb);
                    break;
                }
        }
    }
}

и яне уверен, что делать, где я закомментировал код.Какие-либо предложения?Советы по повышению эффективности также приветствуются.

Заранее спасибо.

1 Ответ

2 голосов
/ 30 мая 2011

Ну, это немного сложно понять, не видя реально существующую XML-структуру и желаемую новую XML-структуру. По сути, я бы предположил, что вам нужен новый узел XML, содержащий пригород на том же уровне, что и элемент postcode.

В этом случае я бы использовал:

XmlElement elem = xDoc.CreateElement("suburb");
elem.InnerText = ...;
node.ParentNode.AppendChild(elem);

EDIT
Что касается эффективности: почему бы вам не прочитать ваш «файл почтового индекса» только один раз, добавив записи в словарь, содержащий почтовый индекс в качестве ключа и пригород в качестве значения? Это гораздо быстрее, чем читать файл каждый раз.

Dictionary<string, string> postCodeMap = new Dictionary<string, string>();
string[] lines = File.ReadAllLines(...);
foreach (string line in lines)
{
   string[] parts = line.Split(',');
   postCodeMap[parts[0]] = parts[1];
}

А позже сделайте:

foreach (XmlNode node in postCodeNodes)
{ 
    string suburb = postCodeMap[node.InnerText];

    XmlElement elem = xDoc.CreateElement("suburb");
    elem.InnerText = suburb;
    node.ParentNode.AppendChild(elem);
}
...