【问题标题】:Extract som info of xml file while keeping header lines/nodes在保留标题行/节点的同时提取 xml 文件的 som 信息
【发布时间】:2016-03-16 10:30:21
【问题描述】:

我有一个 XML 文件,我想从中提取一些数据。我已经阅读了所有关于此主题的questions 以及答案。但我想要的是在提取一些数据时保留标题。请告诉我你的想法好吗?

这是 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<pack version="3.5.6.4" appVersion="3.6j" language="Fa">
  <config>
    <radio name="Target" select="Linux" />
    <check name="Archive" checked="False" />
  </config>  
  <comment />
  <dialogs>
    <dialog name="FDE" used="True" process="Manual" interact="All">
      <check name="Backup" checked="True" locked="False" />
    </dialog>
    <dialog name="PDE" used="True" process="Automatic" interact="All">
      <check name="Backup" checked="False" locked="False" />
      <check name="Archive" checked="False" locked="False" />
    </dialog>
    <dialog name="TFSA" used="False" process="Manual" interact="All">
      <radio name="Mode" select="None" locked="False" />
    </dialog>
  </dialogs>
  <steps>
    <step name="1  INIT" checked="True" locked="False" collapsed="False" childs="Check" id="6">
      <hint />
    </step>
    <step name="2  Copy" checked="True" locked="False" collapsed="False" childs="Check" id="1">
      <hint />
      <step name="2.1  Copy Files to Card...." checked="True" locked="True" collapsed="False" childs="Check" id="5">
        <hint />        
      </step>
    </step>
  </steps>
</pack>

我想要的是将前两行(标题)保留为:

<?xml version="1.0" encoding="utf-8"?>
<pack version="3.5.6.4" appVersion="3.6j" language="Fa">
  <steps>
    <step name="1  INIT" checked="True" locked="False" collapsed="False" childs="Check" id="6">
      <hint />
    </step>
    <step name="2  Copy" checked="True" locked="False" collapsed="False" childs="Check" id="1">
      <hint />
      <step name="2.1  Copy Files to Card...." checked="True" locked="True" collapsed="False" childs="Check" id="5">
        <hint />        
      </step>
    </step>
  </steps>
</pack>

【问题讨论】:

    标签: c# .net xml winforms visual-studio


    【解决方案1】:

    试试 xml linq

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string xml =
                    "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                    "<pack version=\"3.5.6.4\" appVersion=\"3.6j\" language=\"Fa\">" +
                      "<config>" +
                        "<radio name=\"Target\" select=\"Linux\" />" +
                        "<check name=\"Archive\" checked=\"False\" />" +
                      "</config>" +
                      "<comment />" +
                      "<dialogs>" +
                        "<dialog name=\"FDE\" used=\"True\" process=\"Manual\" interact=\"All\">" +
                          "<check name=\"Backup\" checked=\"True\" locked=\"False\" />" +
                        "</dialog>" +
                        "<dialog name=\"PDE\" used=\"True\" process=\"Automatic\" interact=\"All\">" +
                          "<check name=\"Backup\" checked=\"False\" locked=\"False\" />" +
                          "<check name=\"Archive\" checked=\"False\" locked=\"False\" />" +
                        "</dialog>" +
                        "<dialog name=\"TFSA\" used=\"False\" process=\"Manual\" interact=\"All\">" +
                          "<radio name=\"Mode\" select=\"None\" locked=\"False\" />" +
                        "</dialog>" +
                      "</dialogs>" +
                      "<steps>" +
                        "<step name=\"1  INIT\" checked=\"True\" locked=\"False\" collapsed=\"False\" childs=\"Check\" id=\"6\">" +
                          "<hint />" +
                        "</step>" +
                        "<step name=\"2  Copy\" checked=\"True\" locked=\"False\" collapsed=\"False\" childs=\"Check\" id=\"1\">" +
                          "<hint />" +
                          "<step name=\"2.1  Copy Files to Card....\" checked=\"True\" locked=\"True\" collapsed=\"False\" childs=\"Check\" id=\"5\">" +
                            "<hint />" +
                          "</step>" +
                        "</step>" +
                      "</steps>" +
                    "</pack>";
    
                XDocument doc = XDocument.Parse(xml);
    
                XElement steps = doc.Descendants("steps").FirstOrDefault();
                XElement pack = doc.Element("pack");
                doc.Element("pack").ReplaceWith(new XElement("pack", new object[] {pack.Attributes(), steps}));
            }
        }
    }
    

    【讨论】:

    • 如果想将其保存为新文件?
    • doc.Save("filename");
    • 这会复制所有steps 节点。第一个副本没问题,但第二个副本是重复的,将所有节点转换为同一级别。
    • 我需要查看您的实际代码。我发布的代码不会重复,所以我认为问题在于您使用代码的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    相关资源
    最近更新 更多