【问题标题】:linq To XML update valueslinq To XML 更新值
【发布时间】:2017-03-03 07:35:02
【问题描述】:

您好,正在寻找比我更好的解决方案 - 我的 xml 文件 -

<?xml version="1.0" encoding="utf-16"?>
<ITEM>
  <FIELD name="A" value="3" />
  <FIELD name="B" value="testname" />
  <FIELD name="C" value="test" />
  <FIELD name="D" value="desctest%" />
  <FIELD name="E" value="A@" />
  <FIELD name="F" value="value^" />
  <FIELD name="G" value="testvalue%" />
  <FIELD name="H" value="^0" />
</ITEM>

这里是替换所有特殊字符的代码 -

   string text = File.ReadAllText(@"C:\DilipLearn\xml_char\xml_char\test.txt");

                char[] specialchar = { '~', '`', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', };
                XDocument doc = XDocument.Parse(text);
                var elements = doc.Elements().Descendants()
                 .Where(arg => arg.Attribute("value").Value.IndexOfAny(specialchar) >= 0)// == arg.Attribute("value").Value)
                 ;


                foreach (var element in elements)
                {

                    element.SetAttributeValue("value", Regex.Replace(element.Attribute("value").Value, @"[@$%!@#^&*()]", match =>
                     {
                         switch (match.Value)
                         {
                             case "^": return "&#94;";
                             case "@": return "&#64;";
                             case "%": return "&#37;";
                             case "$": return "&#36;";
                             case "&": return "&#38;";
                             default: return "";
                         }
                     })
                                             );
                }


                string resultstring = string.Concat(doc.Declaration.ToString(), doc.ToString());

一切正常。

我只是想知道有没有更好的方法来做到这一点?例如没有循环或其他一些改进。

谢谢。

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为它属于 CodeReview,而不是 StackOverflow(您可以在那里获得工作代码的反馈,SO 是针对不工作的代码)。
  • @ManfredRadlwimmer 没有规定说 SO 适用于不工作的代码。相反,这个问题的问题在于there is no specific programming problem to be solved.
  • 如果我提出更好的建议有什么问题?有 1000 种方法可以解决任何问题,我知道一种方法,寻求一些不同的意见来帮助我优化我的流程。
  • 只要我发布与编程相关的问题应该没有任何问题。
  • 如果您总体上寻求改进,那么这个问题对于 Stack Overflow 来说是题外话,因为没有具体的编程问题需要解决。但是,寻求改进代码的建议正是代码审查的目的。见A guide to Code Review for Stack Overflow users

标签: c# xml linq


【解决方案1】:

这是我的尝试,而不是 foreach 循环:

elements.ToList().ForEach(element =>
        {
            var newValue = Regex.Replace(element.Attribute("value").Value, @"[@$%!@#^&*()]", match => "&#" + ((int)match.Value[0]).ToString()) + ";";
            element.SetAttributeValue("value", newValue);
        });

我正在将元素转换为List&lt;XElement&gt;,这样我就可以使用 ForEach(来自System.Linq 命名空间的扩展方法)。在循环中,我将匹配的字符转换为 int 表示,从而得到它的 ASCII 值。并且(有点脏:))添加&amp;#;

通常情况下,我会尝试使用WebUtility.HtmlEncode,但因为@ 等字符是unicode,编码字符串与非编码字符串相同。

或者,您可以尝试使用Dictionary&lt;char, string&gt; 作为映射表(键是“有问题的”字符(例如@#$ 等),键是替换值(即"&amp;#64;") . 这样你就可以跳过switch case

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多