需要在字符串末尾添加

时间:2016-06-01 14:15:13

标签: c# html html-agility-pack

我正在将wordpress博客转换为其他博客格式,该格式基于敏捷的xml文件构建。

我需要在img tagg的末尾添加,我该怎么做? (13000个文件)

如果我在以下位置运行代码:http://www.xmlvalidation.com/index.php?id=1&L=0我收到错误:

  

11:49元素类型“img”必须由匹配终止   结束标记“”。

<post>
  <author>Admin</author>
<title>Njut</title>
<description> </description>
<content>Så står uterummet färdigt. Ett glastak över några stenplattor, eller glasväggar med plasttak uppsatta på ett trädäck. Det kanske är ett uterum utformat som en traditionell glasveranda från förra sekelskiftet, komplett med målade fönster och snickarglädje. Uterummet blir det som binder samman huset med trädgården och ger hemmet den där extra trevnaden som förgyller såväl sommaren som vintern. Vi talar om den långa ljumma sommarkvällen med den sjunkande solen i väster i goda vänners sällskap. Den svenska sommaren är en underbar men lite opålitlig vän, inte sällan täcks himlen av moln, ibland faller ett strilande regn men under det skyddande taket och innanför de glastäckta väggarna kan man ändå njuta av sommarvärmen. Vem vet, kanske ditt uterum blir det som räddar sommaren, även om det mesta regnar bort, som den kända sången säger.

<img alt="Njut i ditt uterum" src="/image.axd?picture=matsrosen3stor-300x225.jpg" width="300" height="225">Helt klart kommer denna charmiga tillbyggnad garantera att din sommar blir lite mysigare och lite skönare. Solen fortsätter som bekant att skina även när sommaren går mot sitt slut och sedan övergår i höst, lite beroende på vilken form av rutor du valt så fortsätter uterummet att alstra värme och den sköna känslan stannar kvar långt efter att temperaturen utanför sjunkit och höstkläderna tagits fram. Sedan, när vintern kommit och snön ligger vit utanför kan julgranen ställas upp i uterummet och julens alla ljus och all dess värme skiner ut i ett gnistrande vinterlandskap med bara iskristallskimrande glasväggar emellan.

Uterummet kan bli den oas där värme alstras, såväl solens som den mänskliga. En plats för stillhet eller en plats för fest. Uterummet är platsen där dina drömmar blir verklighet. Platsen att njuta av vid såväl alla livets högtider som i den stilla vardagen. En plats där man samlar de nära och kära men också får en stilla stund i ensamhet.

Drömmarna finns där. Dags att förverkliga dem.</content>
<ispublished>True</ispublished>
<iscommentsenabled>True</iscommentsenabled>
<pubdate>2013-04-22 11:35:14</pubdate>
<lastmodified>2013-04-22 11:35:14</lastmodified>
<raters>0</raters>
<rating>0</rating>
<slug>8-revision-7</slug>
<tags> </tags>
<comments> </comments>
<categories> </categories>
<notifications> </notifications>
</post>

C#代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// 2016-05-09 JG/ Läs in alla XML filer 
using System.IO;
using System.Text.RegularExpressions;
using System.Web;
using HtmlAgilityPack;
using System.Net;
using System.Xml;
using System.Net;
using System.Xml.Linq;

namespace ReplaceXML
{
    /// <summary>
    ///  Parses each img and finds if they are in *\wp-content\* folder and if true prepends img src to /image.axd?picture=
    ///  If img also is contained inside a href node, the node is removed with the img saved in same location. 
    /// </summary> 
    public partial class Form1 : Form
    {
        const string goodAmpersand = "&amp;";
        HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
        List<string> log = new List<string>();
        List<string> NoNodesFound = new List<string>();
        List<string> errorLog = new List<string>();


        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Parses img, 
        /// prepends directory with /image.axd?picture=imgname.extension and removes a href node if img is inside one.
        /// </summary>
        /// <param name="imgNode">HtmlAgilityPack node containing img</param>
        private void parseImg(HtmlAgilityPack.HtmlNode imgNode)
        {
            // Parse link
            if (imgNode != null)
            {
                // img src is from wp-content
                if (imgNode.Attributes["src"].Value.Contains("wp-"))
                {
                    // Get path with extension and prepend with new folder.
                    if (imgNode.Attributes["src"] != null)
                    {
                        String imgPath = Path.GetFileName(imgNode.Attributes["src"].Value);
                        imgNode.SetAttributeValue("src", "/image.axd?picture=" + imgPath);
                    }

                    // Remove parent link for img if true.
                    HtmlAgilityPack.HtmlNode parentNode = imgNode.ParentNode;
                    if (parentNode.OriginalName.Contains("a"))
                    {
                        parentNode.ParentNode.RemoveChild(parentNode, true);
                    }

                    // Remove class from img if it contains one.
                    if (imgNode.Attributes["class"] != null)
                    {
                        imgNode.Attributes["class"].Remove();
                    }
                }
            }
        }

        private String htmlEncode(String str)
        {
            str = str.Replace("<", "&lt;");
            str = str.Replace(">", "/&gt;");
            str = str.Replace("nbsp;", "");
            //Console.WriteLine(str);                

            return str;
        }

        private void savefileXML(String file)
        {
            XmlDocument xml = new XmlDocument();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = false;
            settings.Indent = true;
            settings.Encoding = Encoding.UTF8;
            settings.ConformanceLevel = ConformanceLevel.Auto;
            XmlWriter writer = XmlWriter.Create(file, settings);

            // Encode stuff
            try
            {
                htmlDoc.DocumentNode.SelectSingleNode("//content").InnerHtml.Replace("&", "%26");



                //contentNode.InnerHtml = htmlEncode(contentNode.WriteContentTo());
                //contentNode.InnerHtml = contentNode.InnerHtml.Replace("&", "%26");
            }
            catch (Exception)
            {
            }


            try
            {
                Regex badAmpersand = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)");

                //htmlDoc.DocumentNode.InnerHtml = htmlDoc.DocumentNode.InnerHtml.Replace("&", "%26");
                String data = badAmpersand.Replace(htmlDoc.DocumentNode.WriteTo(), goodAmpersand);

                xml.LoadXml(data);
                xml.Save(writer);
            }
            catch (Exception writeError)
            {
                Console.WriteLine(writeError);
                Console.WriteLine(file);
                Console.WriteLine(htmlDoc.DocumentNode.WriteTo());
                errorLog.Add(file);

            }
            finally
            {
                writer.Close();
            }

            //htmlDoc.LoadHtml(htmlDoc.DocumentNode.OuterHtml);
            //htmlDoc.Save(writer);        

        }

        /// <summary>
        /// Run Run Run
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            List<String> errors = new List<String>();

            //  file.DirectoryName + @"\" + file
            // 2016-05-09 Jg/ Läs in alla XML filer från Projektdata
            var sourceDir = new DirectoryInfo(@"C:\Projektdata");
            var targetDir = new DirectoryInfo(@"C:\Projekt\toxml\ReplaceXML\ReplaceXML\bin\Debug\Projektdata2");

            foreach (var file in sourceDir.EnumerateFiles("*.xml", SearchOption.AllDirectories))
            {
                string dbName = file.Directory.Parent.Name;
                string dbTableName = file.Directory.Name;
                string fileName = file.Name;
                string fullPathSource = sourceDir + "\\" + dbName + "\\" + dbTableName;
                string fullPathTarget = targetDir + "\\" + dbName + "\\" + dbTableName;

                // Working dir.
                try
                {
                    // Parse html file
                    //htmlDoc.LoadHtml(HttpUtility.HtmlDecode(System.IO.File.ReadAllText(@"C:\Projektdata\102524-lokpromo\wp_posts\ff2c8ee9-1d5c-4eea-b086-e87a54486bec.xml")));
                    htmlDoc.LoadHtml(HttpUtility.HtmlDecode(System.IO.File.ReadAllText(fullPathSource + "\\" + fileName, Encoding.UTF8)));
                    log.Add(fullPathSource);
                }
                catch (Exception exception)
                {
                    Console.WriteLine("Could not load file.");
                }

                try
                {
                    Console.WriteLine("Working on...." + fullPathSource + "\\" + fileName);
                    //Console.WriteLine(htmlDoc.DocumentNode.WriteTo());
                    //savefileXML(@"C:\Users\jg\Downloads\test.xml");

                    // Clean every img tags 
                    foreach (HtmlAgilityPack.HtmlNode imgNode in htmlDoc.DocumentNode.SelectNodes("//img"))
                    {
                        parseImg(imgNode);
                    }

                }
                catch (Exception exception)
                {
                    Console.WriteLine("Could not find any img nodes skipping...");
                    NoNodesFound.Add(fullPathSource);
                }
                finally
                {
                    Console.WriteLine("Saving " + fullPathTarget);
                    System.IO.Directory.CreateDirectory(fullPathTarget);
                    savefileXML(fullPathTarget + "\\" + fileName);    
                }
            }
            int nrErrors = 0;
            foreach (var item in errorLog)
            {
                Console.WriteLine(item);
                nrErrors++;
            }
            Console.WriteLine("Errors " + nrErrors);
        }
    }
}

原始档案:

<?xml version="1.0"?>

-<post>

<author>Admin</author>

<title>Njut</title>

<description> </description>

<content>Så står uterummet färdigt. Ett glastak över några stenplattor, eller glasväggar med plasttak uppsatta på ett trädäck. Det kanske är ett uterum utformat som en traditionell glasveranda från förra sekelskiftet, komplett med målade fönster och snickarglädje. Uterummet blir det som binder samman huset med trädgården och ger hemmet den där extra trevnaden som förgyller såväl sommaren som vintern. Vi talar om den långa ljumma sommarkvällen med den sjunkande solen i väster i goda vänners sällskap. Den svenska sommaren är en underbar men lite opålitlig vän, inte sällan täcks himlen av moln, ibland faller ett strilande regn men under det skyddande taket och innanför de glastäckta väggarna kan man ändå njuta av sommarvärmen. Vem vet, kanske ditt uterum blir det som räddar sommaren, även om det mesta regnar bort, som den kända sången säger. <a href="http://www.mertidattleva.se/?attachment_id=65" rel="attachment wp-att-65"><img class="alignright size-medium wp-image-65" alt="Njut i ditt uterum" src="http://www.mertidattleva.se/wp-content/uploads/2013/04/matsrosen3stor-300x225.jpg" width="300" height="225" /></a>Helt klart kommer denna charmiga tillbyggnad garantera att din sommar blir lite mysigare och lite skönare. Solen fortsätter som bekant att skina även när sommaren går mot sitt slut och sedan övergår i höst, lite beroende på vilken form av rutor du valt så fortsätter uterummet att alstra värme och den sköna känslan stannar kvar långt efter att temperaturen utanför sjunkit och höstkläderna tagits fram. Sedan, när vintern kommit och snön ligger vit utanför kan julgranen ställas upp i uterummet och julens alla ljus och all dess värme skiner ut i ett gnistrande vinterlandskap med bara iskristallskimrande glasväggar emellan. Uterummet kan bli den oas där värme alstras, såväl solens som den mänskliga. En plats för stillhet eller en plats för fest. Uterummet är platsen där dina drömmar blir verklighet. Platsen att njuta av vid såväl alla livets högtider som i den stilla vardagen. En plats där man samlar de nära och kära men också får en stilla stund i ensamhet. Drömmarna finns där. Dags att förverkliga dem.</content>

<ispublished>True</ispublished>

<iscommentsenabled>True</iscommentsenabled>

<pubDate>2013-04-22 11:35:14</pubDate>

<lastModified>2013-04-22 11:35:14</lastModified>

<raters>0</raters>

<rating>0</rating>

<slug>8-revision-7</slug>

<tags> </tags>

<comments> </comments>

<categories> </categories>

<notifications> </notifications>

</post>

1 个答案:

答案 0 :(得分:0)

使用/&gt;

完成您的img标记
<img alt="Njut i ditt uterum" src="/image.axd?picture=matsrosen3stor-300x225.jpg" width="300" height="225"/>

它应该做的伎俩