XmlDocument как вставить новую запись в существующий файл XML - PullRequest
0 голосов
/ 03 апреля 2020

Я следовал нескольким примерам в Интернете, не повезло, не уверен, что не так с моим кодом.

У меня уже есть xml Файл, и я загружаю его в свою программу и записываю как

<RETS>
  <Servers>
    <serverInfo type="Type1" LoginString="http://rets.Login" LoginUserName="Ret124" LoginPassword="Mypassword" RetsVersion="RETS/1.5"/>
    </Servers>
  <SearchStrings>
    <search type="Type1"><![CDATA[http://rets2_3/GetMetadata]]></search>
  </SearchStrings>  
</RETS>

Затем я позволяю пользователю добавить новую запись, и она должна выглядеть следующим образом = serverInfo type = "Type2" LoginString = "http:www.xml.com" LoginUserName = "Re34555" и т. д. c

XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("RETSDictionary.xml");
            XmlNode node = xmlDoc.SelectSingleNode("RETS/Servers/serverInfo");
            node.Attributes["type"].Value = m_type; // these values coming for text field 
            node.Attributes["LoginString"].Value = m_loginString;
            node.Attributes["LoginPassword"].Value = m_loginPassword;
            node.Attributes["LoginUserName"].Value = m_loginUserName;
            node.Attributes["RetsVersion"].Value = m_retsVersion;


            try {
                xmlDoc.Save("RETSDictionary.xml");
                m_isSuccessful = true;
                m_message = "New RETS Server saved.";
            }
            catch (Exception ex) {
                m_isSuccessful = false;
                m_message = ex.Message;
            }

, поэтому при его сохранении ничего не происходит!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Лучше использовать LINQ для XML. Этот API существует уже более десяти лет. И это заменило предыдущие. Net Framework XML API.

c#

void Main()
{
    const string fileName = @"e:\temp\RETSDictionary.xml";

    XDocument xdoc = XDocument.Load(fileName);

    // compose new fragment
    XElement fragment = new XElement("serverInfo",
            new XAttribute("type", "Type2"),
            new XAttribute("LoginString", "2222.Login"),
            new XAttribute("LoginUserName", "tyy"),
            new XAttribute("LoginPassword", "Mypassword2"),
            new XAttribute("RetsVersion", "RETS/1.5")
        );

    // add new fragment to a proper location
    xdoc.Descendants("Servers").LastOrDefault().Add(fragment);

    // save back to XML file
    xdoc.Save(fileName);
}

Выход

<RETS>
  <Servers>
    <serverInfo type="Type1" LoginString="http://rets.Login" LoginUserName="Ret124" LoginPassword="Mypassword" RetsVersion="RETS/1.5" />
    <serverInfo type="Type2" LoginString="2222.Login" LoginUserName="tyy" LoginPassword="Mypassword2" RetsVersion="RETS/1.5" />
  </Servers>
  <SearchStrings>
    <search type="Type1"><![CDATA[http://rets2_3/GetMetadata]]></search>
  </SearchStrings>
</RETS>
0 голосов
/ 03 апреля 2020

Попробуйте создать новый элемент и затем добавить его в узел Серверы.

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("RETSDictionary.xml");
XmlNode serversNode = xmlDoc.SelectSingleNode("RETS/Servers");
XmlElement node = xmlDoc.CreateElement("serverInfo");
node.SetAttribute("type", m_type); // these values coming for text field 
node.SetAttribute("LoginString", m_loginString);
node.SetAttribute("LoginPassword", m_loginPassword);
node.SetAttribute("LoginUserName", m_loginUserName);
node.SetAttribute("RetsVersion", m_retsVersion);
serversNode.AppendChild(node);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...