0

我有一个包含一些 HTML 的大 XML 文件

<Orchard>
  <Recipe>
    <Name>Generated by Orchard.ImportExport</Name>
    <Author>admin</Author>
  </Recipe>
  <Data>
    <BodyPart Text="<p>My HTML</p><p align ="center">blah blah</p>"/>
  </Data>
</Orchard>

我想编码 HTML,但不编码 XML。我已经尝试过正则表达式,但无法提出解决方案。

有任何想法吗?

干杯

4

3 回答 3

1

如果您想要一个简单的手工编码解决方案:

<Orchard>
  <Recipe>
    <Name>Generated by Orchard.ImportExport</Name>
    <Author>admin</Author>
  </Recipe>
  <Data>
    <BodyPart><Text><![CDATA[<p>My HTML</p><p align ="center">blah blah</p>]]></Text></BodyPart>
  </Data>
</Orchard>

...但请记住,如果 HTML 中存在文本“]]>”,则需要对其进行转义。

如果您无法修改文件的结构,请使用 DOM 查找属性,并且您只需要转义与号(with &amp;)和封装引号(在您的情况下为双引号-- &quot;)。

您可能会指出您使用的服务器端语言以及是否可以更改 XML。

于 2012-05-23T01:04:33.200 回答
0

这是我的解决方案(不是我所知道的最好的方法,但它确实有效):按照 Brett Zamir 的建议,我将 HTML 移到了 CDATA 中。然后我创建了一个小程序来解析 XML,找到所有 BodyPart 项目,并转义里面的 HTML。然后将转义的 HTML 移动到 Text 属性中,并删除内部文本。

于 2012-05-23T21:28:44.150 回答
0

您还可以将 BodyPartDriver 复制到您自己的项目中并覆盖 Import 和 Export 方法。这样你就可以加密/编码做任何你想做的事情。它将在从通常的 BodyPartDriver 导入/导出之后运行。

[UsedImplicitly]
public class BodyPartDriver : ContentPartDriver<BodyPart>
{
    protected override void Importing( BodyPart part, ImportContentContext context )
    {
       //Do your decoding here
        var importedText = context.Attribute( part.PartDefinition.Name, "Text" );
        if ( importedText != null )
        {
            part.Text = importedText;
        }
    }

    protected override void Exporting( BodyPart part, ExportContentContext context )
    {
        //Do your encoding here
        context.Element( part.PartDefinition.Name ).SetAttributeValue( "Text", part.Text );
    }
}
于 2014-11-20T08:50:28.237 回答