J'ai un code ac qui lira un fichier HTML et le renverra sous forme de chaîne / texte.
Une chose que je dois faire est d’analyser la chaîne HTML, de rechercher toutes les balises <embed>
, d’obtenir la valeur dans l’attribut "src", puis de remplacer la <embed>
entière par le contenu du fichier trouvé dans le src
marque.
J'essaie d'utiliser le HtmlAgilityPack
pour me permettre d'analyser le code html.
La seule chose que je ne puisse pas faire, c'est comment remplacer la <embed>
par une autre chaîne et finalement renvoyer la nouvelle chaîne sans <embed>
à l'utilisateur.
Voici ce que j'ai fait
protected string ParseContent(string content)
{
if (content != null)
{
//Create a new document parser object
HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
//load the content
document.LoadHtml(content);
//Get all embed tags
IEnumerable<HtmlNode> embedNodes = document.DocumentNode.Descendants("embed");
//Make sure the content contains at least one <embed> tag
if (embedNodes.Count() > 0)
{
// Outputs the href for external links
foreach (HtmlNode embedNode in embedNodes)
{
//Mak sure there is a source
if (embedNode.Attributes.Contains("src"))
{
//If the file ends with ".html"
if (embedNode.Attributes["src"].Value.EndsWith(".html"))
{
var newContent = GetContent(embedNode.Attributes["src"].Value);
//Here I need to be able to replace the entireembedNode with the newContent
}
}
}
}
return content;
}
return null;
}
protected string GetContent(string path)
{
if (System.IO.File.Exists(path))
{
//The file exists, read its content
return System.IO.File.ReadAllText(path);
}
return null;
}
Comment remplacer la <embed>
par une chaîne?
Je l'ai compris. Grâce à @COlD TOLD, il m'a conseillé de convertir énumérable en liste
Voici ce que j'ai fait.
protected string ParseContent(string content)
{
if (content != null)
{
//Create a new document parser object
HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
//load the content
document.LoadHtml(content);
//Get all embed tags
List<HtmlNode> embedNodes = document.DocumentNode.Descendants("embed").ToList();
//Make sure the content contains at least one <embed> tag
if (embedNodes.Count() > 0)
{
// Outputs the href for external links
foreach (HtmlNode embedNode in embedNodes)
{
//Mak sure there is a source
if (embedNode.Attributes.Contains("src"))
{
if (embedNode.Attributes["src"].Value.EndsWith(".html"))
{
//At this point we know that the source of the embed tag is set and it is an html file
//Get the full path
string embedPath = customBase + embedNode.Attributes["src"].Value;
//Get the
string newContent = GetContent(embedPath);
if (newContent != null)
{
//Create place holder div node
HtmlNode newNode = document.CreateElement("div");
//At this point we know the file exists, load it's content
newNode.InnerHtml = HtmlDocument.HtmlEncode(newContent);
//Here I need to be able to replace the entireembedNode with the newContent
document.DocumentNode.InsertAfter(newNode, embedNode);
//Remove the code after converting it
embedNode.Remove();
}
}
}
}
return document.DocumentNode.OuterHtml;
}
return content;
}
return null;
}
Je pense que vous pouvez essayer d'obtenir le nœud parent du nœud actuel qui est <embed>
puis remplacer le nœud enfant du parent qui est <embed>
var newContent = GetContent(embedNode.Attributes["src"].Value);
var ParentNodeT =embedNode.ParentNode;
var newNodeTtext = "<p>"+newContent+"</p>";
var newNodeT = HtmlNode.CreateNode(newNodeStr);
ParentNodeT.ReplaceChild(newNodeT, embedNode);