【问题标题】:Converting one XML document into another XML document将一个 XML 文档转换为另一个 XML 文档
【发布时间】:2008-10-27 10:13:27
【问题描述】:

我想将一个节点内包含许多元素(大约 150 个)的 XML 文档转换为另一个架构略有不同但大部分元素名称相同的 XML 文档。现在我是否必须手动映射两个文档之间的每个元素/节点。为此,我必须对 150 行映射和元素名称进行硬编码。像这样:

XElement newOrder = new XElement("Order");
newOrder.Add(new XElement("OrderId", (string)oldOrder.Element("OrderId")),
newOrder.Add(new XElement("OrderName", (string)oldOrder.Element("OrderName")),
...............
...............
...............and so on

newOrder 文档可能包含额外的节点,如果在 oldOrder 中没有找到它们,这些节点将被设置为 null。那么,除了硬编码 150 个元素名称(如 orderId、orderName 等)之外,我还有其他选择吗……还是有更好的更易于维护的方法?

【问题讨论】:

    标签: c# xml linq .net-3.5


    【解决方案1】:

    请改用XSLT transform。您可以使用内置的 .NET XslCompiledTransform 进行转换。使您不必键入大量代码。如果您还不了解 XSL/XSLT,那么学习它会让您的简历受益:)

    祝你好运!

    【讨论】:

    • 我们使用 xmlspy 并且在 Visual Studio 中有一个内置的编辑器。我强烈推荐jenitennison.com/xsltw3schools.com/xsl/xsl_languages.asp
    • Michael Kay 的XSLT 程序员指南(Wrox Press)是必不可少的。
    • 我确认:XSLT 对简历有好处。而且它也非常方便。
    【解决方案2】:

    使用 XSLT 转换将旧的 xml 文档转换为新格式。

    【讨论】:

      【解决方案3】:

      XElement.Add 有一个 overload 接受 object[]。

      List<string> elementNames = GetElementNames();
      
      newOrder.Add(
        elementNames
          .Select(name => GetElement(name, oldOrder))
          .Where(element => element != null)
          .ToArray()
        );
      

      //

      public XElement GetElement(string name, XElement source)
      {
        XElement result = null;
        XElement original = source.Elements(name).FirstOrDefault();
        if (original != null)
        {
          result = new XElement(name, (string)original)
        }
        return result;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-27
        • 1970-01-01
        • 2012-11-22
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        相关资源
        最近更新 更多