Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中将INI类型的平面文本文件转换为XML#_C#_Xml_Linq To Xml - Fatal编程技术网

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>