Простой способ сгладить файл XML с помощью LINQ - PullRequest
1 голос
/ 21 октября 2008

Существует ли простой способ с помощью LINQ сгладить файл XML?

Я вижу несколько способов с XSLT, но удивляюсь, какой будет лучший вариант с LINQ?

Я не могу выстроить структуру xml точно так, как, кажется, stackoverflow фильтрует символы шеврона Но это как-то так

узел А

- узел А1

- узел A2

NodeB

Я хочу закончить с

узел A

nodeA1

nodeA2

NodeB

Ответы [ 3 ]

1 голос
/ 25 августа 2011

используя метод расширения, это действительно легко сделать:

public static class XElementExtensions
{
    public static string Path(this XElement xElement)
    {
        return PathInternal(xElement);
    }

    private static string PathInternal(XElement xElement)
    {
        if (xElement.Parent != null)
            return string.Concat(PathInternal(xElement.Parent), ".", xElement.Name.LocalName);

        return xElement.Name.LocalName;
    }
}

тогда:

private static void Main()
{
    string sb =@"<xml>
                <nodeA>
                    <nodeA1>
                        <inner1/><inner2/>
                    </nodeA1>
                    <nodeA2/>
                </nodeA>
                <NodeB/>
                </xml>";

    XDocument xDoc = XDocument.Parse(sb);

    var result = xDoc.Root.Descendants()
        .Select(r => new {Path = r.Path()});

    foreach (var p in result)
        Console.WriteLine(p.Path);
}

Результат:

xml.nodeA
xml.nodeA.nodeA1
xml.nodeA.nodeA1.inner1
xml.nodeA.nodeA1.inner2
xml.nodeA.nodeA2
xml.NodeB
1 голос
/ 21 октября 2008

OK; это зависит от того, какой вывод вы хотите - с XElement вам потребуется немного поработать, чтобы удалить все дочерние узлы и т. д. Однако с XmlDocument все довольно просто:

string xml = @"<xml><nodeA><nodeA1/><nodeA2/></nodeA><NodeB/></xml>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

XmlDocument clone = new XmlDocument();
XmlElement root = (XmlElement) clone.AppendChild(clone.CreateElement("xml"));
foreach(XmlElement el in doc.SelectNodes("//*")) {
    root.AppendChild(clone.ImportNode(el, false));
}
Console.WriteLine(clone.OuterXml);

Выходы:

<xml><xml /><nodeA /><nodeA1 /><nodeA2 /><NodeB /></xml>

[был] Хотите определить «сплющить» в этом контексте? то есть "до" и "после"? В XDocument есть Descendants () и DescendantNodes (), которые могут выполнять эту работу ...

0 голосов
/ 05 ноября 2008

Последняя часть того, что сказал Марк, - это то, что, я думаю, вы ищете. Вот пример, который вы можете зайти в LINQPad и посмотреть результаты «flatten».

string xml = @"<xml><nodeA><nodeA1><inner1/><inner2/></nodeA1><nodeA2/></nodeA><NodeB/></xml>";

XDocument doc = XDocument.Parse(xml);

doc.Dump();
doc.Root.Descendants().Dump();
doc.Descendants().Dump();
doc.Root.Descendants().Count().Dump();
doc.Descendants().Count().Dump();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...