【发布时间】:2016-05-24 12:55:15
【问题描述】:
我有以下 XML 结构的数据文件。没有可用的 SCHEMA 或 DTD。
我希望尝试一个解决方案(脚本)来更新 XML 文件中的内容,在标签之间没有任何字符串表示从上面的行翻译的字符串。
我阅读了另一个 csv 或文本文件中的所有引用,其结构如下:
Filename ; Line ; value in between <source></source> ; value to be entered in between <translation></translation>
例如
<location filename="Student.txt" line="76"/> <source>From</source> <translation></translation>
改成
<location filename="Student.txt" line="76"/> <source>From</source> <translation>Translation of "From"</translation>
节点由其在元素处的两个属性标识,filename=“Studentform.txt”line=“38”。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en_US">
<context>
<name>Student</name>
<message>
<location filename="Student.txt" line="76"/>
<source>From</source>
<translation></translation>
</message>
</context>
<context>
<name>Form</name>
<message>
<location filename="Studentform.txt" line="38"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Studentform.txt" line="653"/>
<source>WILLKOMMEN</source>
<translation>WELCOME</translation>
</message>
</context>
我是 XML 新手,使用 C#/ASP.NET 的经验有限。 我不知道如何处理。在过去的几天里,我学习了正则表达式 (Regex) 和 XML(介绍了 xPath 和 Schema)。
我来自数据背景、Microsoft Excel/VBA、SSRS 和 T-SQL。
我应该如何解决这个问题。请您指导我如何解决上述问题,最终,我应该进一步研究什么来完成它? 是带字符串还是其他的 XSLT 或 C#?
最简单的处理方法是什么?我有两个星期的时间来实现它。
谢谢一百万。
后期编辑:我编的。这是有效的解决方案。最终,我使用LINQ to CSV 将 csv 数据转换为数组。 非常感谢您的指导,stackoverflow。
using LINQtoCSV;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace XMLUpdater
{
//Parse csv data to an array, csv data file= "filenName.txt". All files reside in the directory C:\XMLtool\. Make sure it exists or generate it programatically.
class csvToParse
{
[CsvColumn(Name = "filename", FieldIndex = 1)]
public string filename { get; set; }
[CsvColumn(Name = "line", FieldIndex = 2)]
public string line { get; set; }
[CsvColumn(Name = "source", FieldIndex = 3)]
public string source { get; set; }
[CsvColumn(Name = "translation", FieldIndex = 4)]
public string translation { get; set; }
}
class csv_2_xml
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"C:\XMLtool\Students.xml");
CsvFileDescription inputFileDescription = new CsvFileDescription
{
SeparatorChar = '\t',
FirstLineHasColumnNames = true,
};
CsvContext cc = new CsvContext();
IEnumerable<csvToParse> csvStream =
cc.Read<csvToParse>(@"C:\XMLtool\fileName.txt", inputFileDescription);
foreach (csvToParse item in csvStream)
{
XElement student = doc.Descendants("student")
.Where(x => (x.Element("location") != null) &&
(x.Element("location").Attribute("filename") != null) &&
(x.Element("location").Attribute("filename").Value == item.filename) &&
(x.Element("location").Attribute("line") != null) &&
(x.Element("location").Attribute("line").Value == item.line.ToString())).First();
XElement translation = student.Element("translation");
if (translation != null)
{
translation.Value = item.translation;
}
}
doc.Save(@"C:\XMLtool\Students_modified.xml");
}
}
}
【问题讨论】:
-
这一切都使用XmlSerializer 类自动完成。您可以简单地创建一个类并将其序列化。它完成了读取和写入文件的所有工作。
-
我应该学习什么来应用这个? C#(哪些主题)。请指导我,因为我希望从这个问题中学到一些东西,而不是应用复制/粘贴装置。谢谢。
-
我添加了一个包含示例的答案。
-
Felix,如何从 csv 读取并使用 XmlSerializer 将 csv 中的
值写入 XML 文件?在 1-1.5 周的学习时间内,我应该将哪些学习内容全部粘合起来以使用 C# 掌握该主题。我没有太多时间来完成这些任务。因为实际上我是一些“万事通”,而不是专门的(初级)C# 开发人员。我主要在数据分析领域工作。非常感谢。 -
我认为读取 csv 文件非常简单。逐行读取所有内容并将其放入可以序列化的对象中。 csv->object->序列化。
标签: c# .net regex xml powershell