Выровнять структуру XML по элементам с помощью linq to xml - PullRequest
0 голосов
/ 09 февраля 2012

Я недавно создал пост о выравнивании структуры XML, чтобы каждый элемент и его значения были превращены в атрибуты корневого элемента.Получил отличный ответ и получил его работать.Тем не менее, печально то, что при сглаживании клиент хотел сгладить элементы, а не превращать их в атрибуты: - /

Что у меня есть, это:

<members>
    <member xmlns="mynamespace" id="1" status="1">
       <sensitiveData>
           <notes/>
           <url>someurl</url>
           <altUrl/>
           <date1>somedate</date1>
            <date2>someotherdate</date2>
            <description>some description</description>
            <tags/>
            <category>some category</category>
        </sensitiveData>
        <contacts>
            <contact contactId="1">
                <contactPerson>some contact person</contactPerson>
                <phone/>
                <mobile>mobile number</mobile>
                <email>some@email.com</email>
            </contact>
        </kontakter>
    </member>
</members>

И что мне нужноявляется следующим:

<members>
    <member xmlns="mynamespace" id="1" status="1">
        <sensitiveData/>
        <notes/>
        <url>someurl</url>
        <altUrl/>
        <date1>somedate</date1>
        <date2>someotherdate</date2>
        <description>some description</description>
        <tags/>
        <category>some category</category>
        <contacts/>
        <contact contactId="1"></contact>
        <contactPerson>some contact person</contactPerson>
        <phone/>
        <mobile>mobile number</mobile>
        <email>some@email.com</email>
    </member>
</members>

Таким образом, в основном все элементы, но сплющены как дочерние узлы.Я знаю, что начинать синтаксический анализ таких XML-документов совсем нехорошо, но в основном это единственный оставшийся вариант, поскольку CMS, для которой мы импортируем данные, требует такой плоской структуры, а XML-документ поступает из внешнего веб-сервиса.

Я начал делать рекурсивный метод для этого, но у меня возникло странное ощущение, что его можно сделать более плавным (ну, по крайней мере, настолько плавным, насколько это возможно) с некоторым LINQ to XML (?) Я нелучше всего в linq to xml, так что я надеюсь, что найдется кто-нибудь, кто поможет подсказать, как решить эту проблему?: -)

Любая помощь / подсказка очень ценится!

Заранее спасибо.

/ Бо

1 Ответ

2 голосов
/ 09 февраля 2012

Кажется, это работает - могут быть более аккуратные подходы, по общему признанию:

var doc = XDocument.Load("test.xml");
XNamespace ns = "mynamespace";
var member = doc.Root.Element(ns + "member");

// This will *sort* of flatten, but create copies...
var descendants = member.Descendants().ToList();

// So we need to strip child elements from everywhere...
// (but only elements, not text nodes). The ToList() call
// materializes the query, so we're not removing while we're iterating.
foreach (var nested in descendants.Elements().ToList())
{
    nested.Remove();
}
member.ReplaceNodes(descendants);
...