如何在C#中编辑包含多数值的单行XML range元素?
解决C#修改XML中
range元素(空格分隔双精度值)的问题 问题原因
你遇到的问题是直接将二维double数组传递给SetElementValue方法,该方法会调用对象的默认ToString()方法,而二维数组的ToString()返回的是类型名称System.Double[,],而非你需要的空格分隔数值字符串。
解决方案
1. 修改range的全部数值
直接将目标数值拼接为空格分隔的字符串,再赋值给range元素:
XDocument xdoc = XDocument.Load(@"G:/My Drive/File.xml"); // 存储两个目标值(用一维数组或单独变量都可以) double[] newRange = { 0.1745, 1.3963 }; // 或者 double minVal = 0.1745, maxVal = 1.3963; var targetCoordinate = xdoc.Root.Descendants("objects") .Elements("PinJoint") .Descendants("coordinates") .Elements("Coordinate") .FirstOrDefault(x => x.Attribute("name").Value == "revolute_angle"); if (targetCoordinate != null) { // 将数值转为空格分隔的字符串 targetCoordinate.SetElementValue("range", string.Join(" ", newRange)); // 若用单独变量则写:string.Join(" ", minVal, maxVal) xdoc.Save(@"G:/My Drive/File.xml"); }
2. 修改range的单个数值
先读取现有range的数值,修改其中一个后重新拼接赋值:
XDocument xdoc = XDocument.Load(@"G:/My Drive/File.xml"); var targetCoordinate = xdoc.Root.Descendants("objects") .Elements("PinJoint") .Descendants("coordinates") .Elements("Coordinate") .FirstOrDefault(x => x.Attribute("name").Value == "revolute_angle"); if (targetCoordinate != null) { XElement rangeElement = targetCoordinate.Element("range"); if (rangeElement != null && !string.IsNullOrWhiteSpace(rangeElement.Value)) { // 分割现有值为两个double string[] currentVals = rangeElement.Value.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (currentVals.Length == 2 && double.TryParse(currentVals[0], out double currentMin) && double.TryParse(currentVals[1], out double currentMax)) { // 修改单个值,比如修改最小值为0.2 currentMin = 0.2; // 或修改最大值:currentMax = 1.4; // 重新赋值 rangeElement.Value = string.Join(" ", currentMin, currentMax); xdoc.Save(@"G:/My Drive/File.xml"); } } }
关键说明
SetElementValue方法会把传入的对象直接转为字符串,因此必须手动将数值数组/变量拼接成符合XML格式要求的空格分隔字符串,才能得到正确的range元素内容。
内容的提问来源于stack exchange,提问作者Andrés
相关产品推荐
相关产品推荐

