2009-06-23 10 views
0

Quelle est la syntaxe VB.NET pour ceux-ci? Toute aide à la conversion serait grandement appréciée.Autre LINQ to XML (conversion de C# en VB.NET)

 var defaultStyleName = (string)doc 
      .MainDocumentPart 
      .StyleDefinitionsPart 
      .GetXDocument() 
      .Root 
      .Elements(w + "style") 
      .Where(style => 
       (string)style.Attribute(w + "type") == "paragraph" && 
       (string)style.Attribute(w + "default") == "1") 
      .First() 
      .Attribute(w + "styleId"); 

     var q1 = doc 
      .MainDocumentPart 
      .GetXDocument() 
      .Root 
      .Element(w + "body") 
      .Elements() 
      .Select((p, i) => 
      { 
       var styleNode = p 
        .Elements(w + "pPr") 
        .Elements(w + "pStyle") 
        .FirstOrDefault(); 
       var styleName = styleNode != null ? 
        (string)styleNode.Attribute(w + "val") : 
        defaultStyleName; 
       return new 
       { 
        Element = p, 
        Index = i, 
        StyleName = styleName 
       }; 
      } 
      ); 

     var q2 = q1 
      .Select(i => 
      { 
       string text = null; 
       if (i.Element.Name == w + "p") 
        text = i.Element.Elements() 
         .Where(z => z.Name == r || z.Name == ins) 
         .Descendants(w + "t") 
         .StringConcatenate(element => (string)element); 
       else 
        text = i.Element 
         .Descendants(w + "p") 
         .StringConcatenate(p => p 
          .Elements() 
          .Where(z => z.Name == r || z.Name == ins) 
          .Descendants(w + "t") 
          .StringConcatenate(element => (string)element), 
          Environment.NewLine 
         ); 

       return new 
       { 
        Element = i.Element, 
        StyleName = i.StyleName, 
        Index = i.Index, 
        Text = text 
       }; 
      } 
      ); 

     var q3 = q2 
      .Select(i => 
       new Commands.MatchInfo 
       { 
        ElementNumber = i.Index + 1, 
        Content = i.Text, 
        Style = ContainsAnyStyles(GetAllStyleIdsAndNames(doc, i.StyleName).Distinct(), styleSearchString), 
        Pattern = ContainsAnyContent(i.Text, contentSearchString, regularExpressions, isRegularExpression, caseInsensitive), 
        IgnoreCase = caseInsensitive 
       } 
      ) 
      .Where(i => (styleSearchString == null || i.Style != null) && (contentSearchString == null || i.Pattern != null)); 
     return q3.ToArray(); 

Répondre

0

Dans ces cas, il est préférable d'utiliser un outil, puis de réparer l'outil manquant. Dans ce cas, je .net code converter pour obtenir ce résultat:

Dim defaultStyleName = DirectCast(doc.MainDocumentPart.StyleDefinitionsPart.GetXDocument().Root.Elements(w & "style").Where(Function(style) DirectCast(style.Attribute(w & "type"), String) = "paragraph" AndAlso DirectCast(style.Attribute(w & "default"), String) = "1").First().Attribute(w & "styleId"), String) 

Dim q1 = doc.MainDocumentPart.GetXDocument().Root.Element(w & "body").Elements().[Select](Function(p, i) Do 
    Dim styleNode = p.Elements(w & "pPr").Elements(w & "pStyle").FirstOrDefault() 
    Dim styleName = If(styleNode IsNot Nothing, DirectCast(styleNode.Attribute(w & "val"), String), defaultStyleName) 
    Return New() 
End Function) 

Dim q2 = q1.[Select](Function(i) Do 
    Dim text As String = Nothing 
    If i.Element.Name = w & "p" Then 
        text = i.Element.Elements().Where(Function(z) z.Name = r OrElse z.Name = ins).Descendants(w & "t").StringConcatenate(Function(element) DirectCast(element, String)) 
    Else 
        text = i.Element.Descendants(w & "p").StringConcatenate(Function(p) p.Elements().Where(Function(z) z.Name = r OrElse z.Name = ins).Descendants(w & "t").StringConcatenate(Function(element) DirectCast(element, String)), Environment.NewLine) 
    End If 
    
    Return New() 
End Function) 

Dim q3 = q2.[Select](Function(i) New Commands.MatchInfo()).Where(Function(i) (styleSearchString Is Nothing OrElse i.Style IsNot Nothing) AndAlso (contentSearchString Is Nothing OrElse i.Pattern IsNot Nothing)) 
Return q3.ToArray() 

Encore une fois, le code est sans doute pas parfait, mais il devrait vous obtenir 95% du chemin. Le compilateur devrait vous aider avec le reste.

+0

Salut Andrew, merci pour la réponse. Les grands esprits se ressemblent, malheureusement les services de conversion de code .net ne sont pas assez proches et ne me permettent pas d '"apprendre" le côté vb.net de linq-to-xml et le temps est essentiel pour convertir celui-ci. –

+0

Je suis confus, si le temps est de l'essence pourquoi êtes-vous soucieux d'apprendre à convertir le code? –

+0

Parce que le client insiste uniquement sur VB. J'aurais aimé avoir une meilleure réponse pour toi que ça, lol! –

0

Pour la première, voici une façon de réécrire en VB:

Dim defaultStyleName = (from style in _ 
    doc.MainDocumentPart.StyleDefinitionsPart.GetXDocument().Root.Elements(w & "style") _ 
    where style.Attribute(w & "type").Value = "paragraph" AndAlso _ 
      style.Attribute(w & "default").Value = "1" _ 
    select style).First().Attribute(w & "styleId").Value 

Mais cela est toujours pas si différent de ce que vous feriez en C#.

Dans VB.NET, vous pouvez également utiliser les attributs @ for comme dans [email protected], ce qui vous donne la valeur de chaîne de l'attribut, mais je ne sais pas comment cela fonctionnerait avec vos noms d'attribut concaténés.

En outre, les éléments peuvent être accessibles via la syntaxe .<elementName>, mais encore une fois, vos noms concaténés peuvent ne pas fonctionner avec cela.

En général, les appels DirectCast générés par les outils de conversion en ligne peuvent être éliminés dans VB.

Pour une excellente introduction à la façon dont VB.NET fait LINQ en XML, consultez le How Do I video series by Beth Massi.

+0

Excellente série vidéo, il m'a donné une meilleure idée de comment c'est fait. Maintenant, bien sûr, je suis en cours d'exécution dans un problème avec ce morceau spécifique dans la seconde Dim où il va .Choisir ((p, i) => {var styleNode = p je comprends écrire la première partie de cette comme .Select (Fonction (p, i) mais qu'est-ce que l'opérateur bitwise devient dans ce cas? –

+0

Je ne comprends pas vraiment ce que font vos fonctions lambda, mais il semble qu'il devrait y avoir une syntaxe VB pour votre q1, q2 & Q3 requêtes qui n'utilisent pas lambdas et seraient plus faciles à lire Peut-être pourriez-vous donner quelques détails sur le résultat de ces requêtes. – CoderDennis