【问题标题】:How to convert html markup to xml markup and vice versa如何将 html 标记转换为 xml 标记,反之亦然
【发布时间】:2016-02-29 08:17:31
【问题描述】:

我需要一种算法来将以下 HTML 和 XML 标记相互转换 我的标记非常简单(只是嵌套的 div 标签和 img 标签),所以我不想使用 .dll 或 HTMLAgilityPack 之类的库...

HTML

<div class="row">
  <div class="col-md-12 col-sm-12 col-xs-12 column">
    <div class="ge-content">
     <img src="/blabla.jpg" data-Type="Slider" data-Width="Full"></img>
    </div>
  </div>
</div>

<div class="row">
  <div class="col-md-6 col-sm-12 col-xs-12 column">
    <div class="ge-content">
      <img src="/blabla.jpg" data-Type="Foo" data-Height="100"></img>
    </div>
  </div>

<div class="col-md-6 col-sm-12 col-xs-12 column">
  <div class="row">
    <div class="col-md-12 col-sm-12 col-xs-12 column">
      <div class="ge-content">
        <img src="/blabla.jpg" data-Type="Collection" data-Width="Full" data-DisplayOrder="5"></img>
      </div>
    </div>
   </div>
 </div>
</div>

XML

<root>
   <row>
      <column>
         <ge-content>
            <UserControl>
               <Type>Slider</Type>
               <Width>Full</Width>
            </UserControl>
         </ge-content>
         <class>col-md-12 col-sm-12 col-xs-12</class>
      </column>
   </row>
   <row>
      <column>
         <ge-content>
            <UserControl>
               <Type>Foo</Type>
               <Height>100</Height>
            </UserControl>
         </ge-content>
         <class>col-md-6 col-sm-12 col-xs-12</class>
      </column>
      <column>
         <row>
            <column>
               <ge-content>
                  <UserControl>
                     <Type>Collection</Type>
                     <Width>Full</Width>
                     <DisplayOrder>5</DisplayOrder>
                  </UserControl>
               </ge-content>
               <class>col-md-12 col-sm-12 col-xs-12</class>
            </column>
         </row>
         <class>col-md-6 col-sm-12 col-xs-12</class>
      </column>
   </row>
</root>

【问题讨论】:

  • 请在您的问题中设置正确的缩进。
  • 我建议使用 XSLT 将您的 HTML 标记(看起来像一个有效的 XML)转换为 XML 标记

标签: c# html xml


【解决方案1】:

XSLT 可用于此类转换。 .NET Framework 提供了对 XSL 转换的内置支持,您无需使用第三方库。没有魔法所以你仍然需要编写转换规则。

示例

什么?

假设您有一个有效的 XML(“from.xml”)作为输入

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <div class="row">
      <div class="col-md-12 col-sm-12 col-xs-12 column">
         <div class="ge-content">
            <img src="/blabla.jpg" data-Type="Slider" data-Width="Full" />
         </div>
      </div>
   </div>
   <div class="row">
      <div class="col-md-6 col-sm-12 col-xs-12 column">
         <div class="ge-content">
            <img src="/blabla.jpg" data-Type="Foo" data-Height="100" />
         </div>
      </div>
      <div class="col-md-6 col-sm-12 col-xs-12 column">
         <div class="row">
            <div class="col-md-12 col-sm-12 col-xs-12 column">
               <div class="ge-content">
                  <img src="/blabla.jpg" data-Type="Collection" data-Width="Full" data-DisplayOrder="5" />
               </div>
            </div>
         </div>
      </div>
   </div>
</root>

怎么做?

您可以使用这个 XSL 文件(“how.xsl”)。该文件应该让您基本了解如何编写转换规则。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="/">
      <root>
         <xsl:apply-templates />
      </root>
   </xsl:template>
   <xsl:template match="div[@class='row']">
      <row>
         <xsl:for-each select="div">
            <column>
               <xsl:apply-templates />
               <xsl:variable name="length" select="string-length(@class)" />
               <class>
                  <xsl:value-of select="substring(@class, 1, $length - 7)" />
               </class>
            </column>
         </xsl:for-each>
      </row>
   </xsl:template>
   <xsl:template match="div[@class='ge-content']">
      <ge-content>
         <xsl:apply-templates />
      </ge-content>
   </xsl:template>
   <xsl:template match="img">
      <UserControl>
         <xsl:value-of select="@data-Type" />
      </UserControl>
      <xsl:choose>
         <xsl:when test="@data-Height">
            <Height>
               <xsl:value-of select="@data-Height" />
            </Height>
         </xsl:when>
      </xsl:choose>
      <xsl:choose>
         <xsl:when test="@data-DisplayOrder">
            <DisplayOrder>
               <xsl:value-of select="@data-DisplayOrder" />
            </DisplayOrder>
         </xsl:when>
      </xsl:choose>
      <xsl:choose>
         <xsl:when test="@data-Width">
            <Width>
               <xsl:value-of select="@data-Width" />
            </Width>
         </xsl:when>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>

下一步是将转换规则应用于您的输入文件。

var xslt = new XslTransform();
xslt.Load("how.xsl"); 
xslt.Transform("from.xml", "to.xml");

同样的方法可用于从 XML 文件生成 HTML 文件。

【讨论】:

  • 坦克 Sergii Zhevzhyk,但类标签和用户控件属性在哪里?
  • 我刚刚更新了转换规则。如果对您有用,请接受此答案。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 2023-04-03
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2010-11-26
  • 2010-10-16
相关资源
最近更新 更多