bro*_*her 1 c# regex asp.net sitecore
我目前正在将内容从一个CMS导出/导入到另一个CMS.
我有出口到位.我将旧CMS中的所有内容导出到XML文件,保留文档的结构等.导入也就位,映射到新的PageTypes,映射文本字段等.我还导出并导入了旧的所有媒体到新的CMS.
我唯一关心的是处理每个页面的RichText字段内的内部链接和媒体项链接.
因此,每个页面都包含一个Header,一些通用信息和一个RichTextField,其中包含HTML页面内容.此字段可以包含指向同一站点内其他页面的链接,因此可以包含内部链接以及指向媒体项的链接.
我的问题是,我如何找到这些,并将它们映射到我的新结构.
所有内部链接都是这样的:( <a href="/mycms/~/link.aspx?_id=D9423CEFED254610A5DC6B096A297E17&_z=z">...</a>可能在某些链接上可能有更多属性,例如style="..",class=".."ID等,ID是对旧CMS的ID的引用,并且它总是长度为32个字符.
媒体项目(图像)可能如下所示:<img src="/mycms/~/media/B1FB91AC357347BD84913D56B8791D03.ashx" alt="" width="690" height="202" />.此外,id总是32个字符.
在导入期间,我生成了一个json文件,其中包含旧CMS中的所有mediaId,并将其映射到新CMS中的新ID.所以它看起来像这样;
{
"{0CFBBD0A-9156-4AD9-8A8A-7D30B2D7213B}":1095,
"{BE9BEAAA-F04D-42DA-B52A-44B4B31A389E}":1096,
etc.
}
Run Code Online (Sandbox Code Playgroud)
请注意旧CMS ID的ID格式与链接和媒体中使用的格式不同.剥去花括号和破折号,它会匹配.
最好的方法是什么?我猜测RegEx将是要走的路 - 但是这会是什么样的?
谢谢 :)
你最好的选择是使用像HtmlAgilityPack这样的东西.纯正则表达式通常太粗糙无法成功解析HTML ...这不是一项不可能完成的任务,但比使用HtmlAgilityPack更难.
Eric在他的评论中链接的帖子是历史上臭名昭着的StackOverflow和多个回复,其中详细介绍了为什么不推荐使用Regex解析HTML的方法.根据我的个人经验提供TLDR:HTML页面通常充满了小的"错误".例如,您经常会有<img>未正确关闭的标签(例如<img />).确定性匹配和替换也很困难.
因此,尝试使用正确的工具来完成工作 - 在这种情况下,正确的工具是HtmlAgilityPack.
说到HtmlAgilityPack的使用 - 他们有很好的文档.在您的情况下,您可能希望查看替换子功能.要从他们的文档重现示例,这里使用的是测试HTML:
<body>
<h1>This is <b>bold</b> heading</h1>
<p>This is <u>underlined</u> paragraph</p>
</body>
Run Code Online (Sandbox Code Playgroud)
要操纵它,并替换<h1>节点,您将执行以下操作:
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html); // where html = @"content previously mentioned"
var htmlBody = htmlDoc.DocumentNode.SelectSingleNode("//body");
HtmlNode oldChild = htmlBody.ChildNodes[1];
HtmlNode newChild = HtmlNode.CreateNode("<h2> This is h2 new child heading</h2>");
htmlBody.ReplaceChild(newChild, oldChild);
// now htmlBody has <h2> node instead of old <h1>
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您可能希望使用SelectNodes而不是SelectSingleNode,在XPath中,您将使用要替换的元素.在列表中包含这些元素后,您将迭代它们并根据条件替换内容.
要记住一件事 - 因为你的ID非常详细,有32个字符,你可能会将它们与纯字符串搜索匹配.因此,如果您不是针对某些HTML元素,而是ID,那么您甚至不需要使用HtmlAgilityPack或Regex - 这很简单String.Replace("OLDUID", "NEWUID").