2016-12-17 8 views
0

Вот мой XML-файл: picture of xml fileРедактирование файла XML с помощью C# asp.net

Я хочу изменить это с помощью C# и мой код, как этот

XmlDocument xml = new XmlDocument(); 
     xml.Load(Server.MapPath("xyz.XML")); 

     foreach (XmlElement element in xml.SelectNodes("//table")) 
     { 
      foreach (XmlElement element1 in element) 
      { 
       if (element.SelectSingleNode("//cell").InnerText == "Amit Pate") 
       { 

        XmlNode newname = xml.CreateElement("Name"); 
        newname.InnerText = Name.Text; 
        element.ReplaceChild(newname, element1); 
        //xml.Save(Server.MapPath("xyz.XML")); 
       } 
       if (element.SelectSingleNode("//cell").InnerText == "SSE") 
       { 

        XmlNode newdsg = xml.CreateElement("Designation"); 
        newdsg.InnerText = Designation.Text; 
        element.ReplaceChild(newdsg, element1); 
        //xml.Save(Server.MapPath("xyz.XML")); 
       } 
       if (element.SelectSingleNode("//cell").InnerText == "asp.net") 
       { 

        XmlNode newskill = xml.CreateElement("Skill"); 
        newskill.InnerText = Skill.Text; 
        element.ReplaceChild(newskill, element1); 
        //xml.Save(Server.MapPath("xyz.XML")); 
       } 
       xml.Save(Server.MapPath("xyz.XML")); 
      } 
     } 

Это не работает должным образом. Он всегда обновляет только первый узел XML-файла. Скажите, пожалуйста, что мне не хватает или какой-либо другой способ редактировать xml-файл.

Спасибо

ответ

0

Пока я ничего не знаю о C# или ASP.Net, но знаю XML, вы, возможно, придется изменить свой внутренний for цикл и if логики явно искать каждый <cell> под каждым <row>:

foreach (XmlElement rows in xml.SelectNodes("//table")) 
{ 
     foreach (XmlElement row in rows.SelectNodes("//row")) 
     { 
       if (row.SelectSingleNode("cell").InnerText ... 

Прямо сейчас, кажется, что вы ищете все <cell> узлов под <table>, так как вы используете двойное вперед выражение XPath на element переменном внешний цикл, а затем выбрать только один из них (всегда первые) с SelectSingleNode() (тот же метод используется в VB и VBA, который я знаю немного).


С учетом сказанного, рассмотреть вопрос об использовании XSLT, специального назначения, декларативный язык и родственный к XPath, разработанный специально для редактирования XML файла. При этом вы избегаете любой циклической и условной логики. Практически все языки общего назначения содержат процессор XSLT 1.0, включая C#, ASP, VB, Java, PHP, Python, Perl и т. Д., И эти же языки могут вызывать внешние командные строки для выделенных XSLT-процессоров, таких как Saxon или Xalan, даже XSLT 2.0 and 3.0 processors.

Ниже приведен пример, чтобы повторить свою цель в том, что, как представляется, переименование <cell> узлов:

XML Input

<document> 
    <page> 
     <table rows="3" cols="1"> 
      <row> 
       <cell>Amit Pate</cell> 
      </row> 
      <row> 
       <cell>SSE</cell> 
      </row> 
      <row> 
       <cell>asp.net</cell> 
      </row>   
     </table> 
    </page> 
</document> 

XSLT Script (сохранить как .xsl --special хорошо -форматный .xml-файл и читать как любой другой .xml)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 

    <xsl:template match="/document|page"> 
     <xsl:copy> 
      <xsl:apply-templates select="*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="table"> 
     <xsl:copy> 
      <row><Name><xsl:value-of select="row[1]"/></Name></row> 
      <row><Designation><xsl:value-of select="row[2]"/></Designation></row> 
      <row><Skill><xsl:value-of select="row[3]"/></Skill></row> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML Выход

<?xml version="1.0"?> 
<document> 
    <page> 
     <table> 
      <row> 
       <Name>Amit Pate</Name> 
      </row> 
      <row> 
       <Designation>SSE</Designation> 
      </row> 
      <row> 
       <Skill>asp.net</Skill> 
      </row> 
     </table> 
    </page> 
</document> 

Ссылки

+0

Большое спасибо @Parfait. Он работает правильно. –

Смежные вопросы