c# - 如何将要在某些 XElement 上执行的操作作为参数传递?

标签 c# json xml xpath

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

我们有一个库函数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/

相关文章:

php - 将 JSON 元素添加到多维 JSON 对象 PHP

c# - Json.net 反序列化返回一个空对象

xml - 删除 <ArrayOf.来自 MVC Web Api 响应

java - 如何解析具有相同标签名称的嵌套 xml 标签

c# - 在 Array 类上使用 Linq 扩展

c# - SQLCLR 似乎没有启动 Windows 应用程序

c# - 以编程方式设置 TextBlock 的样式

javascript - 使用 Handlebars 生成 JSON

c# - 在不重新创建菜单的情况下在 C# 中动态过滤菜单 (ContextMenuStrip)?

Java将xml文件内容存储到字符串中