如何传递要在某个XElement上执行的操作作为参数

本文关键字:执行 操作 作作 参数 XElement 何传递 | 更新日期: 2023-09-27 18:04:17

请原谅这些令人困惑的问题措辞,我没有足够的篇幅来清楚地描述它。

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

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

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

我想知道是否有更好的方法来处理这个问题,以防将来有很多处理步骤。

问题是: c#中是否有任何东西可以帮助我传递一组要在一组特定xml元素上执行的匿名函数?这样,使用这个库函数的每个应用程序(有很多,而且它们的使用方式非常不同)可以选择在将XML文档转换为JSON之前对其做什么?

上面描述的库函数:

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"));
    }
}

如何传递要在某个XElement上执行的操作作为参数

传递您的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, ...);