【问题标题】:Variable value is null when I set XML value to null当我将 XML 值设置为 null 时,变量值为 null
【发布时间】:2017-12-20 10:25:25
【问题描述】:

我的 XML

<example>
      <ReferenceNumber xmlns="http://www.example.com/schemas/core/movement">
        <Mnemonic>LHH1</Mnemonic>
        <MovementProjectNumber>4743</MovementProjectNumber>
        <MovementVersion>5</MovementVersion>
      </ReferenceNumber>
</example>

// 获取运动版本值(5).

XDocument NewXML = XDocument.Parse(model.ReturnXML); // model.ReturnXML has XML as shown in above XML.
XNamespace ns = "http://www.example.com/schemas/core/movement";

var MovementVersionNew = from MovVer in NewXML.Root.Element(ns + "ReferenceNumber").Elements(ns + "MovementVersion")
                             select MovVer.Value.ToList().FirstOrDefault().ToString(); 

//获取XML节点部分以更新MovementVersion元素的值。

var MovementVersionRef = (from MovVer in NewXML.Root.Elements(ns + "ReferenceNumber")
                                               select MovVer).ToList();

// 设置 MovementVersion 值为 null。

foreach (XElement element in MovementVersionRef.Descendants())
{
    if (!element.HasElements)
    {
        if (element.Name.ToString().Contains("MovementVersion"))
        {
            element.SetValue("");
        }
    }    
}    

上面的代码会将 MovementVersion 值设置为 null(在 NewXML 中),这是正确的,但同时它也在更改 MovementVersionNew 变量的值(我不希望这个从 5 更改为 null)。

我可以更改或使用什么来不更改旧值,因为我希望稍后在代码中使用该值。请帮我。提前致谢。

【问题讨论】:

  • 必须重新评估行设置 MovementVersionNew。在那里放置一个断点并查看堆栈跟踪以查看导致它运行的原因
  • 感谢@LordWilmore 我检查并发现它在 element.SetValue("") 执行后得到更新。那么可以为此做些什么呢?。
  • 当您说“之后”时,您的意思是什么。你的意思是调用 SetValue("") 的结果,还是仅仅来自代码中的其他地方?
  • 我的意思是调用 SetValue("")

标签: c# xml linq xmldocument


【解决方案1】:

MovementVersionNew 的查询中致电ToList()

static void Main(string[] args)
{
    var xmlstr = 
        @"<example>
            <ReferenceNumber xmlns='http://www.example.com/schemas/core/movement'>
            <Mnemonic>LHH1</Mnemonic>
            <MovementProjectNumber>4743</MovementProjectNumber>
            <MovementVersion>5</MovementVersion>
            </ReferenceNumber>
         </example>";

    XNamespace ns = "http://www.example.com/schemas/core/movement";
    var xml = XDocument.Parse(xmlstr);    

    var MovementVersionNew = (from MovVer in xml.Root.Element(ns + "ReferenceNumber").Elements(ns + "MovementVersion")
                                select MovVer.Value.ToList().FirstOrDefault().ToString()).ToList();

    var MovementVersionRef = (from MovVer in xml.Root.Elements(ns + "ReferenceNumber")
                                select MovVer).ToList();

    foreach (XElement element in MovementVersionRef.Descendants())
    {
        if (!element.HasElements)
        {
            if (element.Name.ToString().Contains("MovementVersion"))
            {
                element.Value = String.Empty;
            }
        }
    }

    MovementVersionNew.ForEach(Console.WriteLine); //Prints "5"
    MovementVersionRef.ForEach(Console.WriteLine);

}

【讨论】:

  • 我在回答之前测试了这段代码 - 它对我有用。
  • 你能把代码粘贴到这里,我可以验证一下。因为在我的情况下,选择 MovVer.ToList() 不起作用(错误:-'System.Xml.Linq.XElement' 不包含'ToList' 的定义,并且没有扩展方法'ToList' 接受'System'类型的第一个参数.Xml.Linq.XElement' 可以找到(您是否缺少 using 指令或程序集引用?)谢谢
  • @JohnL 衷心感谢您。检查您的更新答案后,代码现在正在运行。
  • @TejasThakor 我可以检查一下您是否理解为什么这样做有效?
  • @LordWilmore 我已经更改了 MovementVersionNew(add tolist()) 并更改 -> element.Value = String.Empty;
猜你喜欢
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
相关资源
最近更新 更多