【问题标题】:xml creation in C#在 C# 中创建 xml
【发布时间】:2018-01-25 12:17:49
【问题描述】:

我想要最终的 xml 如下...

<Programs>
  <Program><id>4</id><isRead>true</isRead><isWrite>false</isWrite></Program>
  <Program><id>8</id><isRead>true</isRead><isWrite>true</isWrite></Program>
</programs>

下面是编写的代码

XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode = xmlDoc.CreateNode(XmlNodeType.Element,"programs",null);
xmlDoc.AppendChild(rootNode);


foreach (dynamic item in access)
{
  XmlNode myXmlNode = JsonConvert.DeserializeXmlNode(item.ToString(), "program");
  rootNode.AppendChild(myXmlNode); //error
}

在 myXmlNode.InnerXml 中,我已经开始关注了

<Program><id>4</id><isRead>true</isRead><isWrite>false</isWrite></Program>

因此,为所有子代运行循环以添加父代。但是我收到上面标记的行//错误的错误。错误是:

指定的节点不能作为该节点的有效子节点插入, 因为指定的节点是错误的类型。

【问题讨论】:

  • 漂亮的印刷部分(多行和缩进)见stackoverflow.com/a/1123731/1132334
  • JsonConvert.DeserializeXmlNode 是一个有趣的选择。你去过here吗?
  • 想将此xml作为参数传递给sql SP
  • @ghetal 如果你想反序列化,你可以使用我在下面的回答中建议的反序列化来做到这一点

标签: c# json xml


【解决方案1】:

您正在尝试插入不同类型的 xml 节点。您可以使用ImportNode 来应用它。

foreach (dynamic item in access)
{
    XmlNode myXmlNode = JsonConvert.DeserializeXmlNode(item.ToString(), "program");
    rootNode.AppendChild(rootNode.OwnerDocument.ImportNode(myXmlNode.FirstChild,true));
}

【讨论】:

  • 仍然给出错误:无法导入“文档”类型的节点。
  • 您不能将文档类型导入为节点。我更新了我的答案。
  • 谢谢.. 只需稍加改动即可实现我想要的效果
【解决方案2】:

我建议您为要在 XML 中创建的内容创建一个模型,然后将模型列表序列化为 XML。

原因是您最终会得到更易于维护的东西。

你的模型应该是这样的:

public class Program
{
    public int Id { get; set; }
    public bool IsRead { get; set; }
    public bool IsWrite { get; set; }
}

你可以按照这篇文章进行序列化:

https://support.microsoft.com/en-gb/help/815813/how-to-serialize-an-object-to-xml-by-using-visual-c

【讨论】:

    【解决方案3】:

    我自己使用过 XmlSerializer 库几次。

    public class Program
    {
        public int Id { get; set; }
        public bool IsRead { get; set; }
        public bool IsWrite { get; set; }
    }
    
    public class XmlTemplate
    {
        public List<Program> Programs { get; set; }
    }
    
    class MainProgram
    {
        static void Main(string[] args)
        {
            var xmlTemplate = new XmlTemplate();
            xmlTemplate.Programs = new List<Program>();
            xmlTemplate.Programs.Add(new Program() { Id = 123, IsRead = true, IsWrite = false });
            xmlTemplate.Programs.Add(new Program() { Id = 456, IsRead = false, IsWrite = true });
    
            var serializer = new XmlSerializer(typeof(XmlTemplate));
            var stream = new StringWriter();
    
            serializer.Serialize(stream, xmlTemplate);
    
            Console.WriteLine(stream.ToString());
            Console.ReadKey();
    
        }
    }
    

    这会以以下格式输出 XML:

    <XmlTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Programs>
        <Program>
          <Id>123</Id>
          <IsRead>true</IsRead>
          <IsWrite>false</IsWrite>
        </Program>
        <Program>
          <Id>456</Id>
          <IsRead>false</IsRead>
          <IsWrite>true</IsWrite>
        </Program>
      </Programs>
    </XmlTemplate>
    

    【讨论】:

    • 已经接近解了,想看看这个方法能不能实现
    • 可以的。通过使用 XmlSerializer 和模板类,您既可以从对象序列化到 XML,也可以从 XML 反序列化到对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多