【问题标题】:Need to add </img> at end of string需要在字符串末尾添加 </img>
【发布时间】:2016-06-02 14:56:12
【问题描述】:

我正在将 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>

【问题讨论】:

  • 你有没有尝试过任何东西?你希望我们做什么?给你这个简单问题的代码?为什么不自己尝试一些东西并在这里询问您是否有具体问题?基本上你想要做的是用另一个字符串替换一个字符串。我打赌你会找到一些东西......
  • 那是 html-nested-in-xml 吗?如果是 html,则没有 &lt;/img&gt;,只有 &lt;img /&gt;。并且 html-in-xml 无论如何都应该填充在 cdata 块中,以防止 html 标签被解释为 xml。
  • 停止生成无效的 xml?
  • 键盘和耐心....
  • 这是复杂的 C# 代码,我们得到了错误,但 img 结束标记似乎解决了问题

标签: c# html html-agility-pack


【解决方案1】:

用 /> 完成你的 img 标签

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

它应该可以解决问题

【讨论】:

  • 是的,现在我也必须用 C# 编写代码并添加到字符串中,也许有人知道怎么做?
  • 到目前为止,您的 C# 代码是什么样的?您可以将其添加到问题中吗?
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2022-06-20
  • 1970-01-01
相关资源
最近更新 更多