【问题标题】:What is the correct/optimal way to populate an XML?填充 XML 的正确/最佳方法是什么?
【发布时间】:2012-08-30 08:38:29
【问题描述】:

我有一个 XML:

<PolicyChangeSet schemaVersion="2.1" username="" description="">
  <Note>
    <Content></Content>
  </Note>
  <Attachments>
    <Attachment name="" contentType="">
      <Description></Description>
      <Location></Location>
    </Attachment>
  </Attachments>
</PolicyChangeSet>

我有一个填充 XML 的方法:

public static void GeneratePayLoad(string url, string policyID)
        {
            string attachmentName = policyID.Split(new string[] { "REINSTMT" }, StringSplitOptions.None)[0] + "REINSTMT";

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(AppVars.pxCentralXMLPayloadFilePath);
            XmlNode node = xmlDoc.SelectSingleNode("/PolicyChangeSet");
            node.Attributes["username"].Value = AppVars.Username;
            node.Attributes["description"].Value = "Upload Documents";

            node = xmlDoc.SelectSingleNode("PolicyChangeSet/Note/Content");
            node.InnerText = "The attached pictures were sent by the producer.";

            node = xmlDoc.SelectSingleNode("/PolicyChangeSet/Attachments/Attachment");
            node.Attributes["name"].Value = attachmentName;
            node.Attributes["contentType"].Value = "image/tiff";

            node = xmlDoc.SelectSingleNode("/PolicyChangeSet/Attachments/Attachment/Description");
            node.InnerText = "Combined reinstatement picture file";

            node = xmlDoc.SelectSingleNode("/PolicyChangeSet/Attachments/Attachment/Location");
            node.InnerText = url;

            xmlDoc.Save(AppVars.pxCentralXMLPayloadFilePath);
        }

我的问题是,填充 XML 的最佳方式是什么?我觉得有一种更简单的方法可以做到这一点。例如,我确信有一种方法可以消除多次选择单个节点的需要(我目前正在做的事情)。大家有什么推荐的?最好的方法是什么?

【问题讨论】:

  • 老实说,我会使用一个工具从 xml 模式创建一个对象,然后生成 xml,我会创建一个实例,填充它,并将其序列化为 xml,而不是直接操作xml.
  • @asawyer 是正确的。最好的方法是通过序列化/反序列化。 Xml 应该只用于数据传输。您将 xml 文档反序列化为一个类,然后在该类中设置值,然后反序列化回 xml。
  • 使用您需要的信息定义类型并使用 .NET XML 序列化。
  • 你们能给我看一个序列化/反序列化的例子吗?

标签: c# xml


【解决方案1】:

使用序列化/反序列化策略可能是一种选择,但有时如果您不想为此使用 DTO 污染您的代码,则有时您希望避免这种情况。在最后一种情况下,您可以使用已经提到的与XDocument 相关的东西,如下所示:

var doc = XElement.Parse(
    @"<PolicyChangeSet schemaVersion='2.1' username='' description=''>
    <Note>
        <Content></Content>
    </Note>
    <Attachments>
        <Attachment name='' contentType=''>
        <Description></Description>
        <Location></Location>
        </Attachment>
    </Attachments>
    </PolicyChangeSet>");

doc.Descendants("Note")
   .Descendants("Content").First().Value = "foo";

var attachment = doc.Descendants("Attachments")
                    .Descendants("Attachment").First();

attachment.Attributes("name").First().Value = "bar";
attachment.Attributes("contentType").First().Value = "baz";

...

doc.Save(...);

您将使用Load 方法而不是Parse 从文件中加载您的xml。这是另一种选择。

【讨论】:

    猜你喜欢
    • 2015-12-18
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多