使用 LINQ 编辑 XML 输出
本文关键字:输出 XML 编辑 LINQ 使用 | 更新日期: 2023-09-27 18:33:26
我有一个正在运行的进程的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 很陌生,甚至不完全确定它是最好的途径。我在项目中创建了一个数据集,其中有一个从数据库中填充的 DataTable,其中包含我需要处理的内容。和。。。这就是我所得到的。现在,我正在使用大量繁琐的 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 + 转换委托,从这一点开始,就像每个属性一行一样简单。下面是一个实现示例:
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);
}
我总是,总是,总是擅长将xml存储到自定义类中,然后在我的C#环境中使用它们。使修改它的过程感觉更自然。请看我的问题 这里 看看最好的方法。这需要更多的时间,但从长远来看,它使事情变得容易得多。你说你想要最好的路线和学习,对吧?;)