请原谅我没有足够的空间来清楚地描述它令人困惑的问题措辞。
我们有一个库函数SerializeXelement
它采用作为某些 XML 结构根的 XElement,执行处理步骤,并以 JSON 格式返回它。
此处理步骤是针对单一目的的特定步骤(向特定元素添加属性,由传递给此函数的 xpaths 的数组参数指定 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"));
}
}
最佳答案
将您的 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, ...);
关于c# - 如何将要在某些 XElement 上执行的操作作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39172793/