2009-12-29 3 views
1

J'utilise le HtmlAgilityPack pour analyser un fichier XML que je convertis en HTML. Certains des noeuds seront convertis en un équivalent HTML. Les autres qui sont inutiles que je dois enlever tout en maintenant le contenu. J'ai essayé de le convertir en un noeud #text sans aucune chance. Voici mon code:en changeant un type de noeud à #text tout en gardant les innernodes avec le HtmlAgilityPack

private HtmlNode ConvertElementsPerDatabase(HtmlNode parentNode, bool transformChildNodes) 
{ 
    var listTagsToReplace = XmlTagMapping.SelectAll(string.Empty); // Custom Dataobject 
    var node = parentNode; 
    if (node != null) 
    { 
     var bNodeFound = false; 
     if (node.Name.Equals("xref")) 
     { 
      bNodeFound = true; 
      node = NodeXref(node); 
     } 
     if (node.Name.Equals("graphic")) 
     { 
      bNodeFound = true; 
      node = NodeGraphic(node); 
     } 
     if (node.Name.Equals("ext-link")) 
     { 
      bNodeFound = true; 
      node = NodeExtLink(node); 
     } 

     foreach (var infoTagToReplace in listTagsToReplace) 
     { 
      if (node.Name.Equals(infoTagToReplace.XmlTag)) 
      { 
       bNodeFound = true; 
       node.Name = infoTagToReplace.HtmlTag; 
       if (!string.IsNullOrEmpty(infoTagToReplace.CssClass)) 
        node.Attributes.Add("class", infoTagToReplace.CssClass); 

       if (node.HasAttributes) 
       { 
        var listTagAttributeToReplace = XmlTagAttributeMapping.SelectAll_TagId(infoTagToReplace.Id); // Custom Dataobject 
        for (int i = 0; i < node.Attributes.Count; i++) 
        { 
         var bDeleteAttribute = true; 
         foreach (var infoTagAttributeToReplace in listTagAttributeToReplace) 
         { 
          if (infoTagAttributeToReplace.XmlName.Equals(node.Attributes[i].Name)) 
          { 
           node.Attributes[i].Name = infoTagAttributeToReplace.HtmlName; 
           bDeleteAttribute = false; 
          } 
         } 
         if (bDeleteAttribute) 
          node.Attributes.Remove(node.Attributes[i].Name); 
        } 
       } 
      } 
     } 
     if (transformChildNodes) 
      for (int i = 0; i < parentNode.ChildNodes.Count; i++) 
       parentNode.ChildNodes[i] = ConvertElementsPerDatabase(parentNode.ChildNodes[i], true); 

     if (!bNodeFound) 
     { 
      // Replace with #text 
     } 
    } 
    return parentNode; 
} 

A la fin, je dois faire le remplacement du noeud (où vous voyez le commentaire « Remplacer par #text ») si le nœud est introuvable. J'ai arraché mes cheveux (ce qui en reste) toute la journée et c'est probablement quelque chose de stupide. Je n'arrive pas à obtenir l'aide pour compiler et il n'y a pas de version en ligne. Aide Stackoverflow! Tu es mon seul espoir. ;-)

+0

Ma réponse était évidemment fausse - c'était trop dur de garder une trace de tous les blocs de portée quand je ne pouvais pas voir le début et la fin en même temps ...: P De toute façon, deux nouvelles questions: 1) Devriez-vous vraiment donne 'parentNode.ChildNodes [i]' la valeur de la récursivité, ou devriez-vous la donner à une autre variable, par exemple 'node'? 2) Pourquoi renvoyez-vous 'parentNode' et non' node'? –

Répondre

0

Je pense que vous pourriez faire:

return new HtmlNode(HtmlNodeType.Text, parentNode.OwnerDocument, 0); 

Bien sûr, ajoute le nœud à la tête du document, mais je suppose que vous avez une sorte de code en place pour gérer où dans le document, le noeud devrait être ajouté.

En ce qui concerne le commentaire de la documentation, le téléchargement actuel (au moment de l'écriture) du Html Agility Pack documentation contient un fichier CHM qui ne nécessite pas de compilation pour être visualisé.

+0

ouais, je l'ai eu ... malheureusement toutes les pages dans ce document disent "fichier non trouvé" ... bien qu'il y ait un index ... – craigmoliver

Questions connexes