将XmlNode添加到XmlElement

时间:2011-05-30 14:03:32

标签: c# .net xml xmlnode

我从网络服务中获取了一个肥皂信封,其中包含姓名和地址等客户数据。该地址不包含城市/郊区,但包含邮政编码。我将所有城市和郊区的邮政编码都放在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 个答案:

答案 0 :(得分:2)

嗯,如果不实际看到存在的XML结构和所需的新XML结构,就很难知道。基本上我假设您想要一个包含与postcode元素处于同一级别的郊区的新XML节点。

在那种情况下,我用过:

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

修改
至于效率:你为什么不只阅读一次“邮政编码文件”,将条目添加到包含邮政编码作为密钥和郊区作为值的字典中?这比每次读取文件要快得多。

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);
}