如何传递要在某个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"));
}
}
传递您的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, ...);