Нужна помощь с LINQ to XML - PullRequest
       2

Нужна помощь с LINQ to XML

0 голосов
/ 19 августа 2010

Все, я новичок в Linq to XML и у меня есть вопрос о том, как генерировать XML на основе следующего формата, предписанного поставщиком, из List<string>, содержащего имена вложенных каталогов.- Пожалуйста помоги.Спасибо

Формат поставщика:

<eccu>
  <match:recursive-dirs value="store" >  
    <match:recursive-dirs value="images" >  
       <revalidate>now</revalidate>  
    </match:recursive-dirs>  
  </match:recursive-dirs> 
</eccu>

Вот мой код.Однако, как вы можете видеть, это не дает правильно отформатированных результатов.:

// NOTE - textBox1.Text = 'http://www.someurl.com/dir1/di2/images'
    var dirs = (new Uri(textBox1.Text)).Segments.Select(dir => dir.Replace("/", String.Empty)).Where( dir => !String.IsNullOrWhiteSpace(dir)).ToList();
    var x = new XDocument(new XDeclaration("1.0", null, null), new XElement("eccu", from s in dirs select new XElement("recursive-dirs", new XAttribute("value", s)), new XElement("revalidate", "now")));

Это производит:

<eccu>
  <recursive-dirs value="dir1" />
  <recursive-dirs value="dir2" />
  <recursive-dirs value="images" />
  <revalidate>now</revalidate>
</eccu>

Ответы [ 2 ]

1 голос
/ 19 августа 2010

Ваш XML немного некорректен, так как ему нужно определить пространство имен "match". Следующий код создаст XML с правильно определенным атрибутом пространства имен

XNamespace aw = "http://www.adventure-works.com";
        XElement root = new XElement(aw + "Root",
            new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
            new XElement(aw + "Child", "content")
        );

, который производит

<aw:Root xmlns:aw="http://www.adventure-works.com"><aw:Child>content</aw:Child></aw:Root>

(взято из http://msdn.microsoft.com/en-us/library/system.xml.linq.xnamespace.xmlns.aspx) Вам нужно будет соответствующим образом изменить свой код.

0 голосов
/ 19 августа 2010

Что-то вроде этого должно делать это жестко, при условии, что match:recursive-dirs является действительным xml (я не знаю).Поскольку вы говорите о строках списка, мне нужно будет увидеть их формат для работы с оператором LINQ.

XElement xml = new XElement("eccu",
                   new XElement("match:recursive-dirs", 
                       new XAttribute("value", "store"),
                           new XElement("match:recursive-dirs", 
                                new XAttribute("value", "images"),
                                new XElement("revalidate", "now")
                          )
                       )
                   )
               );

на основе HookedOnLink.com

Редактировать на основе комментариев
Это не так красиво, но

string text = "http://www.someurl.com/dir1/di2/images";
var dirs = (new Uri( text )).Segments
                            .Select( dir => dir.Replace( "/", String.Empty ) )
                            .Where( dir => !String.IsNullOrWhiteSpace( dir ) )
                            .ToList( );

var x = new XDocument(
            new XDeclaration( "1.0", null, null ), 
                new XElement( "eccu" ) );

var eccu = x.Elements( ).First( );
XElement current = eccu;

foreach( var dir in dirs )
{
    XElement newXElement = new XElement( "recursive-dirs", 
                           new XAttribute( "value", dir ) );
    current.Add( newXElement );
    current = newXElement;
}

current.Add( new XElement( "revalidate", "now" ) );     
Console.Out.WriteLine( x.ToString());

производит

<eccu>
  <recursive-dirs value="dir1">
    <recursive-dirs value="di2">
      <recursive-dirs value="images">
        <revalidate>now</revalidate>
      </recursive-dirs>
    </recursive-dirs>
  </recursive-dirs>
</eccu>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...