XmlDocument按子项的内部文本值排序节点

时间:2016-08-29 13:17:32

标签: c# xml sorting

我想通过pos节点中的数字对名为ImageInfo的节点进行排序,因为我有按钮可以向上或向下改变位置,我需要在pos发生变化时以正确的顺序对ImageInfo节点进行排序。

我为没有任何c#代码而道歉,但我向你们保证,我已经尝试了很多不同的东西而且需要帮助。

这是我的xml:

<?xml version="1.0" encoding="utf-8"?>
<MplAndSiImages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MplImages>
    <ImageInfo>
      <pos>1</pos>
      <Name>1.png</Name>
      <ParentObjectId>b66a23a8-6268-e611-80e2-c4346bad02e8</ParentObjectId>
      <Url>http://localhost:8080/b66a23a8-6268-e611-80e2-c4346bad02e8/1.png</Url>
    </ImageInfo>
    <ImageInfo>
      <pos>2</pos>
      <Name>2.png</Name>
      <ParentObjectId>b66a23a8-6268-e611-80e2-c4346bad02e8</ParentObjectId>
      <Url>http://localhost:8080/b66a23a8-6268-e611-80e2-c4346bad02e8/2.png</Url>
    </ImageInfo>
    <ImageInfo>
      <pos>3</pos>
      <Name>3.png</Name>
      <ParentObjectId>b66a23a8-6268-e611-80e2-c4346bad02e8</ParentObjectId>
      <Url>http://localhost:8080/b66a23a8-6268-e611-80e2-c4346bad02e8/3.png</Url>
    </ImageInfo>
  </MplImages>
  <SiImages />
</MplAndSiImages>

这是我的c#代码:

在点击动作链接按钮时调用它,我需要它将poition更改为1以便在列表中将其移动并且我有数字更改但是xml需要进行排序以便它具有ImageInfo节点的顺序正确。

public ActionResult MoveUp(string name, string id)
{

    var pathConfig = WebConfigurationManager.AppSettings["ProductImageFolderPath"];
    var url = pathConfig + id + "\\" + "ModelConfig.xml";

    XmlDocument doc = new XmlDocument();

    doc.Load(url);
    XmlNode root = doc.DocumentElement;
    XmlNode upNode = root.SelectSingleNode("/MplAndSiImages/MplImages/ImageInfo[Name/text() = '" + name + "']/pos");

    string upNodeValue = upNode.InnerText;
    int upNodeInt = Int32.Parse(upNodeValue);
    upNodeInt = upNodeInt - 1;
    var upNodeString = upNodeInt.ToString();
    upNode.InnerText = upNodeString;

    XmlNode downNode = root.SelectSingleNode("/MplAndSiImages/MplImages/ImageInfo/pos[text() = '" + upNodeString + "']");

    string downNodeValue = downNode.InnerText;
    int downNodeInt = Int32.Parse(downNodeValue);
    downNodeInt = downNodeInt + 1;
    var downNodeString = downNodeInt.ToString();
    downNode.InnerText = downNodeString;

    Func<string, int> ParseIntOrDefault = (string input) =>
    {
        int output;
        int.TryParse(input, out output);
        return output;
    };

    var result = doc.SelectNodes("MplAndSiImages/MplImages/*")
        .Cast<XmlNode>()
        .OrderBy(element => element.SelectSingleNode("pos").InnerText)
        .ToList();


    doc.Save(url);
    return RedirectToAction("UploadAnImage", new { id = id });
}

我已经看过这个并试过了,但有没有办法用xmldocument做到这一点:

XElement root = XElement.Load(xmlfile);
var orderedtabs = root.Elements("Tab")
                      .OrderBy(xtab => (int)xtab.Element("Order"))
                      .ToArray();
root.RemoveAll();
foreach(XElement tab in orderedtabs)
    root.Add(tab);
root.Save(xmlfile);

我订购的图片显示在网页上。 当按下向上移动按钮时,图像将在列表中向上移动,并与其上方的图像交换位置。

1 个答案:

答案 0 :(得分:1)

使用linq to xml你可以:

var result = XDocument.Load("data.xml")
                      .Descendants("ImageInfo")
                      .OrderBy(element => element.Element("pos")?.Value)
                      .ToList();

为了按int值排序,你可以:

Func<string,int> ParseIntOrDefault = (string input) =>
{
    int output;
    int.TryParse(input, out output);
    return output;
};

var result = XDocument.Load("data.xml")
                      .Descendants("ImageInfo")
                      .OrderBy(element => ParseIntOrDefault(element.Element("pos")?.Value))
                      .ToList();

使用XmlDocument来读取xml:

var doc = new XmlDocument();
doc.Load("data.xml");

var result = doc.SelectNodes("MplAndSiImages/MplImages/*")
                .Cast<XmlNode>()
                .OrderBy(element => element.SelectSingleNode("pos").InnerText)
                .ToList();

您也可以使用上面的ParseIntOrDefault