c# - 使用 LINQ 编辑 XML 输出

标签 c# sql xml linq

我有一个来自正在运行的进程的 XML 输出文件,该文件需要根据我们数据库中的一组表编辑各种字段的内容。例如,

中包含的内容
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfUserReportPreviewListDto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserReportPreviewListDto>
    <ExtensionData />
    <Id>previewReportFieldsId</Id>
    <Field0>-7</Field0>
    <Field1>L</Field1>
    <Field2>Lab Work Complete</Field2>
    <Field3>False</Field3>
    <Field4>LabWorkComplete</Field4>
    <Field6>False</Field6>
  </UserReportPreviewListDto>
  <UserReportPreviewListDto>
    <ExtensionData />
    <Id>previewReportFieldsId</Id>
    <Field0>-6</Field0>
    <Field1>S</Field1>
    <Field2>Sent to Lab</Field2>
    <Field3>False</Field3>
    <Field4>SentToLab</Field4>
    <Field6>False</Field6>
  </UserReportPreviewListDto>
  <UserReportPreviewListDto>
    <ExtensionData />
    <Id>previewReportFieldsId</Id>
    <Field0>-5</Field0>
    <Field1>V</Field1>
    <Field2>Void</Field2>
    <Field3>False</Field3>
    <Field4>Void</Field4>
    <Field6>True</Field6>
    <Field7>12/11/2013</Field7>
    <Field9>769</Field9>
  </UserReportPreviewListDto>

需要将 Field4 从 LabWorkComplete (tblEnum.FieldTypeDesc) 更改为 2 (tblEnum.FieldTypeNum)。

我对使用 LINQ 还很陌生,我什至不能完全确定这是实现此目的的最佳途径。我在项目中创建了一个数据集,其中从数据库中填充了一个数据表,其中包含我需要使用的内容。而且……就我所知。现在我正在使用大量繁琐的 If 语句来完成此任务,并且我认为这种途径可能比像这样的语句集合更有效。

var xe = XElement.Load("serializer.xml");
string field4Value = xe.XPathSelectElement(@"/UserReportPreviewListDto/Field4").Value;
if (field4Value == "Incomplete")
{
    xe.XPathSelectElement(@"/UserReportPreviewListDto/Field4").Value = "0";
}
    else if (field4Value == "SendToLab")
{
xe.XPathSelectElement(@"/UserReportPreviewListDto/Field4").Value = "1";
}
    else if (field4Value == "LabWorkComplete")
{
    xe.XPathSelectElement(@"/UserReportPreviewListDto/Field4").Value = "2";
}

这就是我所在的地方。如果 LINQ 不是最好的途径,那会是什么?如果是这样,最好的方法是什么?此外,我们将不胜感激按照这些思路推荐的任何特别有用的资源;我宁愿学习代码也不愿复制代码。毕竟我不想下周再问这个问题。

最佳答案

您的 XML 结构很奇怪。 Field0...Field6 不常见,里面通常有有意义的名字。您始终可以编写一个封装字符串到整数字符串转换的函数,并且只需提供一个 xpath 作为参数。然后更上一层楼,提供 xpath + conversion delegate,从这一点开始就像每个属性一行一样简单。这是一个实现示例:

using System;
using System.Xml.Linq;
using System.Xml.XPath;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      var xe = XElement.Load("serializer.xml");
      ConvertValue(xe, @"/UserReportPreviewListDto/Field4", TranslateValueField4);
    }

    private static void ConvertValue(XElement xe, string xpath, TranslateValue translator)
    {
      string field4Value = xe.XPathSelectElement(xpath).Value;
      xe.XPathSelectElement(xpath).Value = translator(field4Value);
    }

    private delegate string TranslateValue(string value);

    private static string TranslateValueField4(string value)
    {
      switch (value)
      {
        case "Incomplete" :
          return "0";
        case "SendToLab" :
          return "1";
        case "LabWorkComplete":
          return "2";
        default:
          throw new NotImplementedException(); //or provide handling for unknown values
      }
    }
  }
}

您也可以避免使用 xpath,而只使用 foreach 进行迭代:

static void Main(string[] args)
{
  var doc = XDocument.Load(@"input.xml");
  foreach (var xe in doc.Root.Elements("UserReportPreviewListDto"))
  {
    ConvertValue(xe, "Field4", TranslateValueField4);
  }
  //doc.Save(path);
}

private static void ConvertValue(XElement xe, string fieldName, TranslateValue translator)
{
  //.Element returns Nothing if element is missing, may want to handle this case
  XElement field4 = xe.Element(fieldName);
  string field4Converted = TranslateValueField4(field4.Value);
  field4.SetValue(field4Converted);
}

关于c# - 使用 LINQ 编辑 XML 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27320971/

相关文章:

针对慢查询的 SQL 匹配

java - java 中的 XMLParser

c# - vscode 有 csproj 生成器吗?

c# - UWP 上的水平滑动手势

c# - 装饰器流是否也作为流实例的适配器或其他设计模式来实现?

c# - 有没有办法预测 `Marshal.GetExceptionForHR(code, pointers)` 会抛出 `AccessViolationException`

php - 带有数组的 MySQL WHERE 子句包含键

java - Android sqlite邻接模型

xml - 如何在 sublime 3 中安装 sublime text indent xml

python - 使用 Django 将 XML 发送到 activeMQ