C# 在C中将INI类型的平面文本文件转换为XML#
我有一个包含以下行的文本文件:C# 在C中将INI类型的平面文本文件转换为XML#,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有一个包含以下行的文本文件: root_node1_node2_node3=value root_node1_node2_node3=value root_node1_node2_node3_node4=value root_node5_node6=value 我想要的是: <root> <node1> <node2> <node3>value</node3> <node3&
root_node1_node2_node3=value
root_node1_node2_node3=value
root_node1_node2_node3_node4=value
root_node5_node6=value
我想要的是:
<root>
<node1>
<node2>
<node3>value</node3>
<node3>value</node3>
<node3>
<node4>value</node4>
</node3>
</node2>
</node1>
<node5>
<node6>value</node6>
</node5>
</root>
价值
价值
价值
价值
因此,我想将不同长度的行转换为XML节点,然后将它们合并到C#中的单个XML文件中。我读过关于LINQtoXML的文章,但我对它还是新手 请帮忙
这就是我现在的处境:
// file
string fileName = Path.GetFileName(file);
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
string fileSourceDirectory = Path.GetDirectoryName(file);
// xml
XDocument xDoc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
// root
new XElement(fileNameWithoutExtension)
);
try
{
using(StreamReader sr = new StreamReader(file))
{
string line;
// go line-by-line
while((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
// element=value -> [element, value]
string[] elementAndValue = line.Split('=');
// elment_element_element -> [element, elelement, element]
string[] elements = elementAndValue[0].Split('_');
// value
string value = elementAndValue[1];
List<XElement> elementList = new List<XElement>();
for(int i = 0; i < elements.Length; i++)
{
if(i == (elements.Length - 1))
{
elementList.Add(new XElement(elements[i], value));
Console.WriteLine("Added: " + elements[i] + "=" + value);
}
else
{
elementList.Add(new XElement(elements[i]));
Console.WriteLine("Added: " + elements[i]);
}
}
xDoc.Root.Add(elementList[0]);
Console.WriteLine("Added first item to root.");
for(int i = 0; i < elementList.Count - 1; i++)
{
elementList[i].Add(elementList[i + 1]);
Console.WriteLine("Added " + elementList[i + 1] + " to " + elementList[i]);
}
}
}
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
// save xml
xDoc.Save(outputDir + "\\" + fileNameWithoutExtension + ".xml");
//文件
字符串文件名=Path.GetFileName(文件);
字符串fileNameWithoutExtension=Path.GetFileNameWithoutExtension(文件);
字符串fileSourceDirectory=Path.GetDirectoryName(文件);
//xml
XDocument xDoc=新XDocument(
新XDeclaration(“1.0”,“utf-8”,空),
//根
新XElement(文件名不带OutExtension)
);
尝试
{
使用(StreamReader sr=新StreamReader(文件))
{
弦线;
//逐行
而((line=sr.ReadLine())!=null)
{
控制台写入线(行);
//元素=值->[元素,值]
string[]elementAndValue=line.Split('=');
//元素元素元素->[元素,元素,元素]
string[]elements=elementAndValue[0]。拆分(“”);
//价值观
字符串值=元素和值[1];
List elementList=新列表();
for(int i=0;i
这就是我想要的第一部分
现在的输出是这样的:
<root>
<node1>
<node2>
<node3>value</node3>
</node2>
</node1>
<node1>
<node2>
<node3>value</node3>
</node2>
</node1>
<node1>
<node2>
<node3>
<node4>value</node4>
</node3>
</node2>
</node1>
<node5>
<node6>value</node6>
</node5>
</root>
价值
价值
价值
价值
现在,我想将这些节点合并为我第一次描述的格式
谢谢你的帮助。:) 您好,请查看此链接,该链接对您的搜索非常有用 试试这个
XDocument xDoc = new XDocument();
while ((line = sr.ReadLine()) != null)
{
string[] nodes = line.Split('_');
for (int j = 0; j < nodes.Length; j++)
{
if(j == 0) // assume that all line should start with same root name
{
if (xDoc.Root == null)
{
var root = new XElement(nodes[j]);
xDoc.Add(root);
}
}
else
{
var previousNode = xDoc.Descendants(nodes[j - 1]).FirstOrDefault();
if (nodes[j].Contains('='))
{
var elementValues = nodes[j].Split('=');
if (previousNode.DescendantNodes().Count() == 1 && previousNode.Value != "")
{
previousNode.AddAfterSelf(new XElement(nodes[j - 1], new XElement(elementValues[0], elementValues[1])));
}
else
{
previousNode.Add(new XElement(elementValues[0], elementValues[1]));
}
}
else
{
var node = xDoc.Descendants(nodes[j]);
if (node.Count() == 0)
{
previousNode.Add(new XElement(nodes[j]));
}
}
}
}
XDocument xDoc=new XDocument();
而((line=sr.ReadLine())!=null)
{
string[]nodes=line.Split('');
对于(int j=0;j
可行的解决方案:再实施一次:
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Xml.Linq;
名称空间Ini2XML
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串[]行=新字符串[]{
“根节点1\u节点2\u节点3=值”,
“根节点1\u节点2\u节点3=value1”,
“根节点1\u节点2\u节点3\u节点4=值”,
“根节点5\u节点6=值”,
“根节点5\u节点6\u节点7\u节点8\u节点8=值”,
“根节点55=值2 2232 232 2”
};
XDocument xml=Ini2XMLConverter.ConvertStringArrayToXML(行);
Save(Console.Out);
}
公共类Ini2XMLConverter
{
公共静态XDocument ConvertStringArrayToXML(IEnumerable行)
{
如果(lines==null){returnnull;};
XDocument xml=新XDocument();
foreach(行中的字符串s)
{
//从中定义路径和值
<root>
<node1>
<node2>
<node3>value</node3>
<node3>value1</node3>
<node3>
<node4>value</node4>
</node3>
</node2>
</node1>
<node5>
<node6>value</node6>
<node6>
<node7>
<node8>
<node8>value</node8>
</node8>
</node7>
</node6>
</node5>
<node55>value2 2232 2 232 2 2</node55>
</root>