2016-08-29 2 views
-1

Я хочу сортировать узлы с именем ImageInfo по числу в pos-узле, потому что у меня есть кнопки, которые меняют положение вверх или вниз, и мне нужно отсортировать узел ImageInfo в правильный порядок, когда pos изменился.XmlDocument сортирует узлы по внутреннему текстовому значению для ребенка

Прошу прощения за отсутствие кода 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); 

Я упорядочивания изображений для отображения на веб-странице. , и когда нажата кнопка перемещения вверх, изображение будет перемещено вверх в списке и поменяется местами с изображением над ним.

+0

Кажется, что у вас нет кода, и мы напишем все для вас. Этот сайт не является услугой кодирования. Вы должны потратить некоторое усилие и попробовать несколько вещей свой собственный –

+0

жаль, что я сделал много вещей, которые я просто не могу найти что-нибудь, что подходит мне (все отсортировано по атрибуту) извините, я не сказал этого, но я искал часы и им довольно новый для всего, что связано с xml. –

+0

@Purecrafttube - пожалуйста, объясните, чего вы пытаетесь достичь? Заказ изображений с какой целью? –

ответ

1

Использование LINQ для 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 от

+0

Кажется, я ошибаюсь - этот сайт * является * кодовым сервисом. Хорошо знать. –

+0

В соответствии с заголовком, OP использует XmlDocument, а не XDocument –

+0

Мне нужно что-либо сделать с переменной результата (im работает на веб-приложении). –

Смежные вопросы