【问题标题】:Edit a xml file using c# asp.net使用 c# asp.net 编辑 xml 文件
【发布时间】:2016-12-17 12:09:29
【问题描述】:

这是我的 xml 文件:

我想用 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 文件。

谢谢

【问题讨论】:

    标签: asp.net xml c#-4.0


    【解决方案1】:

    虽然我对 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 ...
    

    现在,您似乎正在搜索 <table> 下的所有 <cell> 节点,因为您在外部循环的 element 变量上使用了双正向 XPath 表达式,然后使用 @ 仅选择其中一个(始终是第一个) 987654333@(我知道一点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输入

    <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 脚本(另存为 .xsl -- 特殊格式良好的 .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>
    

    参考文献

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多