C#读取和写入特定的CSS类

时间:2014-01-13 14:38:24

标签: c# css parsing

我正在尝试编写一个C#应用程序,它将对某些CSS文件执行操作。假设您有以下CSS代码:

.ClassOne
{   
    color: #FFFFFF;    
    font-weight:normal;
    font-size: 9pt;
    font-family: Tahoma;                    
    vertical-align: middle;
    border: solid 1px #7F7F7F;  
    padding: 1px 1px 1px 1px;
    background-color: #B48410;
    background-position: center center;
}

.ClassTwo
{
    color: #FFFFFF;        
        background-repeat: repeat-x;
    background-color: #000000;
}

.ClassThree
{   
    color: #000000;    
    font-weight:normal;
    font-size: 9pt;
    font-family: Tahoma;                    
    vertical-align: left;
    border: solid 1px #F3Dc51;  
    padding: 1px 1px 1px 1px;
    background-color: #A32DF1;
}

我想要做的是搜索文件中的特定类,比如ClassOne,然后存储适用于该类的background-color元素。这不必对CSS文件中的所有类进行,因此在上面的示例中,我可能只想存储ClassOne和ClassThree的背景颜色。

然后应用程序应该将存储的值复制到另一个具有相同类的CSS文件中。

我将知道必须执行这些操作的类。

我看过ExCSS,但我不确定如何使用它,如果它在这个实例中有用。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这应该让你开始使用ExCss,至少在解析部分:

    [Test]
    public void Banana([Values (".ClassThree")] string targetClass, [Values ("#A32DF1")] string expectedColor)
    {
        var parser = new Parser();
        var sheet = parser.Parse(sample);
        var result = sheet.Rulesets
            .Where(s => s.Selector.ToString() == targetClass)
            .SelectMany(r => r.Declarations)
            .FirstOrDefault(d => d.Name.Equals("background-color", StringComparison.InvariantCultureIgnoreCase))
            .Term
            .ToString();
        Assert.AreEqual(expectedColor, result);            
    }

你最终要做的事情,也许不是使用Linq,而是循环你的css并使用与你所针对的声明匹配的声明中的值来构建一个新的css。例如,下面,这可能不是最佳效率,但可以做到这一点:

        var targetClasses = new List<string> { ".ClassOne", ".ClassThree" };
        var targetDecls = new List<string> { "background-color" };

        var parser = new Parser();
        var sheet = parser.Parse(sample);
        foreach (var r in sheet.Rulesets)
        {
            if (targetClasses.Contains(r.Selector.ToString()))
            {
                Debug.WriteLine(r.Selector.ToString());
                Debug.WriteLine("{");
                foreach (var d in r.Declarations)
                {
                    if (targetDecls.Contains(d.Name))
                    {
                        Debug.WriteLine("\t" + d);
                    }
                }
                Debug.WriteLine("}");
            }
        }