2009-07-23 6 views
2

J'écris un programme pour ajouter un code aux fichiers htmlmeilleure façon de trouver fin de balise body en html

je vais utiliser une série de indexof et des boucles pour trouver ce qui est essentiellement « » X (où X est l'endroit je cherche)

Il me est apparu qu'il pourrait y avoir une façon plus éloquente de le faire

que quelqu'un a des suggestions.

quoi il ressemble actuellement

<body onLoad="JavaScript:top.document.title='Abraham L Barbrow'; if (self == parent) document.getElementById('divFrameset').style.display='block';"> 

ce qu'il devrait ressembler quand je suis fait


<body onLoad="JavaScript:top.document.title='Abraham L Barbrow'; if (self == parent) document.getElementById('divFrameset').style.display='block';"> 
<script type="text/javascript"> 
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); 
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); 
</script> 
<script type="text/javascript"> 
try { 
var pageTracker = _gat._getTracker("UA-9xxxxxx-1"); 
pageTracker._trackPageview(); 
} catch(err) {}</script> 
+0

à clearify Je veux ajouter du code après la balise – Crash893

Répondre

5

Je ne suis pas sûr de vous comprendre, mais voulez-vous dire cela?

// Given an HTML document in "htmlDocument", and new content in "newContent" 
string newHtmlDocument = htmlDocument.Replace("</body>", newContent+"</body>"); 

Et il est probablement évident que je ne sais pas C# ... Vous auriez probablement envie de faire le cas de l'étiquette « corps » insensible via regexps.

+0

Ou vous pouvez utiliser un analyseur DOM entière comme certaines des autres réponses. Mais pourquoi charger de la merde supplémentaire si c'est tout ce que vous avez à faire? – markwatson

+0

c'est exactement ce que je veux faire, mais au lieu de l'ajouter avant la balise de corps d'extrémité je veux ajouter après la balise de début le problème que j'ai est la balise body isnt toujours juste il peut avoir des attributs – Crash893

+0

Dans ce cas, vous pouvez utiliser l'une des solutions d'analyseur DOM. Vous pouvez faire correspondre l'étiquette du corps d'ouverture avec une regex, mais cela ne fonctionne pas parfaitement dans tous les cas. Cela a été mon expérience de toute façon ... – markwatson

4

Je recommande d'utiliser HtmlAgilityPack pour analyser le code HTML dans le DOM et travailler avec elle .

+2

Je pense que cela peut être comme utiliser un canon pour écraser une mouche. Le fait que son html soit trivial je suppose.si je devais faire une recherche dans les fenêtres ce serait juste indexof (""); mais l'index de ne supporte pas les jokers – Crash893

+1

La manipulation DOM est vraiment le moyen le plus sûr de le faire, crash893. Utiliser la manipulation de chaînes sur la sérialisation HTML d'un objet est comme utiliser un marteau pour rédiger des plans. –

+1

+1 pour une bataille par analogie – Janie

2

Si les fichiers HTML sont XHTML vous pouvez toujours utiliser la classe XmlDocument pour l'interpréter. Vous pouvez ensuite rechercher facilement l'élément body et lui ajouter un élément enfant. Ceci placerait l'élément juste avant l'étiquette de fermeture /body >.

1

Je ne suis pas sûr que le contenu exemple que vous souhaitez ajouter après la balise est celui ou non correct, mais si elle est, je vois deux problèmes:

  1. Le code Google Analytics devrait être ajouté juste avant le étiquette de fin, pas l'étiquette d'ouverture. Cela garantit que vous n'avez pas à attendre le chargement avant de charger votre propre code.
  2. Si vous ajoutez un autre javascript, pourquoi ne pas l'ajouter dans un fichier externe et l'exécuter à la place?

espoir qui est de l'aide :)

0

C'est ce que je suis

ne hésitez pas à faire des suggestions

private void button1_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog OFD = new OpenFileDialog(); 
      OFD.Multiselect = true; 
      OFD.Filter = "HTML Files (*.htm*)|*.HTM*|" + 
      "All files (*.*)|*.*"; 

      if (OFD.ShowDialog() == DialogResult.OK) 
      { 
       foreach (string s in OFD.FileNames) 
       { 
        Console.WriteLine(s); 
        AddAnalytics(s); 
       } 
       MessageBox.Show("done!"); 
      } 
     } 
     private void AddAnalytics(string filename) 
     { 

      string Htmlcode = ""; 
      using (StreamReader sr = new StreamReader(filename)) 
      { 
       Htmlcode = sr.ReadToEnd(); 
      } 
      if (!Htmlcode.Contains(textBox1.Text)) 
      { 
       Htmlcode = Htmlcode.Replace("</body>", CreateCode(textBox1.Text) + "</body>"); 

       using (StreamWriter sw = new StreamWriter(filename)) 
       { 
        sw.Write(Htmlcode); 
       } 
      } 
     } 

     private string CreateCode(string Number) 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine(); 
      sb.AppendLine("<script type=\"text/javascript\">"); 
      sb.AppendLine("var gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");"); 
      sb.AppendLine("document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js' "); 
      sb.AppendLine("<//script>"); 
      sb.AppendLine("<script type=/\"text//javascript/\">"); 
      sb.AppendLine("try {"); 
      sb.AppendLine(string.Format("var pageTracker = _gat._getTracker(/\"{0}/\");", Number));///"UA-9909000-1" 
      sb.AppendLine("pageTracker._trackPageview();"); 
      sb.AppendLine("} catch(err) {}<//script>"); 
      sb.AppendLine(); 
      return sb.ToString(); 
     } 
    } 
3
public string AddImageLink(string emailBody,string imagePath) 
{ 
    try 
    { 
    HtmlDocument doc = new HtmlDocument(); 
    doc.LoadHtml(emailBody); 

    HtmlNode node = doc.DocumentNode.SelectSingleNode("//body"); 

    // get body using xpath query ("//body") 
    // create the new node .. 

    HtmlNodeCollection LinkNode = new HtmlNodeCollection(node); 
    // 

    HtmlNode linkNode = new HtmlNode(HtmlNodeType.Element,doc,0); 
    linkNode.Name = "A"; 
    linkNode.Attributes.Add("href","www.splash-solutions.co.uk"); 


    HtmlNode imgNode = new HtmlNode(HtmlNodeType.Element,doc,1); 
    imgNode.Name = "img"; 
    imgNode.Attributes.Add("src",imagePath); 

    //appending the linknode with image node 
    linkNode.AppendChild(imgNode); 

    LinkNode.Append(linkNode); 

    //appending LinkNode to the body of the html 
    node.AppendChildren(LinkNode); 


    StringWriter writer = new StringWriter(); 
    doc.Save(writer); 
    emailBody = writer.ToString(); 
    return emailBody; 
}