У меня есть следующий код, который собирает все элементы и атрибуты из файла XML и отправляет на консоль. Это работает без проблем.

Я хочу отправить данные в текстовый файл, но отображаются только первая или последняя строка. У кого-нибудь есть предложения по отправке данных в текстовый файл?

XmlDocument xmlDoc = new XmlDocument();         

xmlDoc.Load(path);
XmlNode rootNode = xmlDoc.DocumentElement;
DisplayNodes(rootNode);
Console.ReadLine();

void DisplayNodes(XmlNode node)
{
    //Print the node type, node name and node value of the node
    if (node.NodeType == XmlNodeType.Text)
    {
         Console.WriteLine(node.Value.TrimStart());    
    }
    else
    {
        Console.WriteLine(node.Name.TrimStart());
    }

    //Print attributes of the node
    if (node.Attributes != null)
    {                        
        XmlAttributeCollection attrs = node.Attributes;
        foreach (XmlAttribute attr in attrs)
        {
              Console.WriteLine(attr.Name + " " + attr.Value + "\n");
        }
    }

    XmlNodeList children = node.ChildNodes;
    foreach (XmlNode child in children)
    {
          DisplayNodes(child);
    }
}
c#
0
Rhino 9 Апр 2019 в 18:56

2 ответа

Лучший ответ

Вы можете использовать статические методы в теге File класс для записи в текстовый файл он завершает создание потока за вас.

Во-первых, мы могли бы переписать ваш метод выше, чтобы вернуть List<string>, который затем мог бы быть записан в консоль или файл, или что-нибудь еще:

public static List<string> GetNodeInfo(XmlNode node)
{
    if (node == null) return new List<string>();

    var nodes = new List<string>
    {
        node.NodeType == XmlNodeType.Text
            ? node.Value.TrimStart()
            : node.Name.TrimStart()
    };

    if (node.Attributes != null)
    {
        nodes.AddRange(node.Attributes.Cast<XmlAttribute>()
            .Select(attribute => $"{attribute.Name} {attribute.Value}\n"));
    }

    nodes.AddRange(node.ChildNodes.Cast<XmlNode>().SelectMany(GetNodeInfo));

    return nodes;
}

Теперь мы можем использовать этот метод, чтобы получить информацию об узле, а затем записать ее во что угодно:

List<string> nodeInfo = GetNodeInfo(myNode);

// Write it to the console:
Console.WriteLine(string.Join(Environment.NewLine, nodeInfo));

// Write it to a file:
File.WriteAllLines(myFilePath, nodeInfo);
0
Rufus L 9 Апр 2019 в 17:11

Я только что нашел ответ на свой вопрос. Я использовал следующее:

Использование (FileStream f = новый FileStream (fileName, FileMode.Append, FileAccess.Write)) использование (StreamWriter s = новый StreamWriter (f))

Foreach Console.Writeline изменить на

S.WriteLine

0
Rhino 9 Апр 2019 в 16:12