更新 Linq to XML 元素值串联问题

发布于 2024-08-12 00:53:28 字数 507 浏览 2 评论 0原文

我正在尝试编写一个 app.config / web.config 纠错应用程序,它将审核我们的开发人员应用程序是否有不正确的环境设置。我正在使用 Linq to XML 来完成此任务,但遇到了障碍。

var query =
    from el in doc.Descendants().Element("SMTPHost")
    select el;

foreach (XElement host in query)
{
    if (Regex.IsMatch(el.Value, "mail.mycompany.com")
    {
        el.Value = Regex.Replace(el.Value, 
            "mail.mycompany.com", "devmail.mycompany.com");

    }
}

当我运行此命令时,它会连接正确元素的祖先节点之一的所有子文本值,并删除所有子元素。

有更好的方法来做这种事情吗?

谢谢!

I am trying to write a app.config / web.config error correcting app which will audit our developers applications for incorrect environment settings. I am using Linq to XML to accomplish this and I am hitting a snag.

var query =
    from el in doc.Descendants().Element("SMTPHost")
    select el;

foreach (XElement host in query)
{
    if (Regex.IsMatch(el.Value, "mail.mycompany.com")
    {
        el.Value = Regex.Replace(el.Value, 
            "mail.mycompany.com", "devmail.mycompany.com");

    }
}

When I run this, it concatenates all the child text values for one of the ancestor nodes of the correct element and removes all of the child elements.

Is there a better way to do this sort of thing?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

森末i 2024-08-19 00:53:28

首先,我认为您在这里没有必要使用正则表达式。您是否知道由于点的匹配方式而会匹配“mailxmycompanyxcom”?使用 String.Contains 和 String.Replace。当然,如果您的真实代码使用真正的模式,那就是另一回事了。

不管怎样,还是进入正题吧。在我看来,您只对一次处理一个子节点感兴趣 - 这是正确的吗?如果是这样,请使用:

var query =  doc.Descendants()
                .Element("SMTPHost")
                .DescendantNodes()
                .OfType<XText>();

foreach (XText textNode in query)
{
    textNode.Value = textNode.Value.Replace("mail.mycompany.com", 
                                            "devmail.mycompany.com");
}

Firstly, I think your use of regular expressions is unnecessary here. Are you aware that will match "mailxmycompanyxcom" because of how dots are matched? Using String.Contains and String.Replace. Of course, if your real code uses genuine patterns, that's a different matter.

Anyway, on to the issue. It sounds to me like you're only interested in handling a single child node at a time - is that correct? If so, use:

var query =  doc.Descendants()
                .Element("SMTPHost")
                .DescendantNodes()
                .OfType<XText>();

foreach (XText textNode in query)
{
    textNode.Value = textNode.Value.Replace("mail.mycompany.com", 
                                            "devmail.mycompany.com");
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文