如何将对某些XElement执行的操作作为参数传递?

时间:2016-08-26 18:37:31

标签: c# json xml xpath

原谅令人困惑的问题措辞,我没有足够的空间来清楚地描述它。

我们有一个库函数SerializeXelement,它接受​​一个XElement,它是某个XML结构的根,执行一个处理步骤,并以JSON格式返回它。

此处理步骤是针对单一目的的特定步骤(将属性添加到特定元素,由传递给此函数的xpath的数组参数指定IEnumerable<string> ensureNodeArray = null (如上所述,此功能如下所示)。

我最近要求此函数执行另一个不同的处理步骤,所以我通过添加另一个xpath的字符串集合来重载此函数,SerializeXelement调用另一个帮助函数来处理。

我想知道在未来的许多处理步骤中是否有更好的方法来处理这个问题。

问题是: c#中有什么东西可以帮助我传递一组匿名函数,这些函数要在一组特定的xml元素上执行吗?因此,使用此库函数的每个应用程序(有很多,并且它们使用它的方式完全不同)可以选择在转换为JSON之前对XML文档执行的操作是什么?

上述图书馆职能:

public static string SerializeXelement(XElement xEl, IEnumerable<string> ensureNodeArray = null, 
    bool removeAttrSymbol = true, Formatting formatting = Formatting.None, bool omitRootObject = false)
{
    if (ensureNodeArray != null)
    {
        AddArrayAttributes(xEl, ensureNodeArray);
    }

    var output = JsonConvert.SerializeXNode(xEl, formatting, omitRootObject);
    if (removeAttrSymbol) { output = output.RemoveJsonXmlAttributeSymbols(); }
    return output;
}

private static void AddArrayAttributes(XElement xEl, IEnumerable<string> nodeArray)
{
    XNamespace ns = "http://james.newtonking.com/projects/json";
    xEl.Add(new XAttribute(XNamespace.Xmlns + "json", ns));

    // Add array attribute to all relevent nodes
    foreach (var nde in nodeArray.Select(xEl.XPathSelectElements).SelectMany(ndes =>
    {
        var xElements = ndes as XElement[] ?? ndes.ToArray();
        return xElements;
    }))
    {
        nde.Add(new XAttribute(ns + "Array", "true"));
    }
}

1 个答案:

答案 0 :(得分:3)

将您的xml处理器作为Action调用它。

public static string SerializeXelement(Action<XElement, IEnumerable<string>> xmlProcessor, XElement xEl, IEnumerable<string> ensureNodeArray = null, 
    bool removeAttrSymbol = true, Formatting formatting = Formatting.None, bool omitRootObject = false)
{
    if (xmlProcessor != null)
    {
        xmlProcessor(xEl, ensureNodeArray);
    }

    var output = JsonConvert.SerializeXNode(xEl, formatting, omitRootObject);
    if (removeAttrSymbol) { output = output.RemoveJsonXmlAttributeSymbols(); }
    return output;
}

用法:

SerializeXelement(AddArrayAttributes, xmlRoot, ...);