XML 문서가 있고 날짜 데이터가 포함되어 있습니다.XML 문서에서 Xpath 정렬
<Message>
<messagetext>Testing purpose only</messagetext>
<date>05.02.2010</date>
</Message>
가 나는 XPath는 키 그들을 정렬하려는 사람에 대한 PLS를 알고 있다면 내가 얻을 수있는 방법 나에게
덕분에 다음과 같이 XML로는 LINQ를 사용하여 할 수있는 모든 관련
XML 문서가 있고 날짜 데이터가 포함되어 있습니다.XML 문서에서 Xpath 정렬
<Message>
<messagetext>Testing purpose only</messagetext>
<date>05.02.2010</date>
</Message>
가 나는 XPath는 키 그들을 정렬하려는 사람에 대한 PLS를 알고 있다면 내가 얻을 수있는 방법 나에게
덕분에 다음과 같이 XML로는 LINQ를 사용하여 할 수있는 모든 관련
도움이됩니다. 난 당신이 형식 MM.DD.YYYY를 사용하는 가정,하지만 쉽게 원하는 경우 변경할 수 있습니다
using System;
using System.Linq;
using System.Xml.Linq;
public class Message
{
public string Text { get; set; }
public DateTime Date { get; set; }
}
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load("input.xml");
var messages = doc.Descendants("Message")
.Select(element => new Message
{
Text = element.Element("messagetext").Value,
Date = DateTime.ParseExact(element.Element("date").Value, "MM.dd.yyyy", null)
}).OrderBy(message => message.Date);
foreach (Message message in messages)
{
Console.WriteLine("{0} : {1}", message.Date, message.Text);
}
}
}
결과 : 내가 사용
02-05-2010 00:00:00 : Test1
17-05-2010 00:00:00 : Test2
22-05-2010 00:00:00 : Test3
테스트 데이터 :
<xml>
<Message>
<messagetext>Test1</messagetext>
<date>05.02.2010</date>
</Message>
<Message>
<messagetext>Test3</messagetext>
<date>05.22.2010</date>
</Message>
<Message>
<messagetext>Test2</messagetext>
<date>05.17.2010</date>
</Message>
</xml>
내 서버에 .net 2.0이있어 LINQ를 사용할 수 없습니다. –
우선 XPath는 XSLT 변환의 일부로 제외하고 정렬 작업을 돕지 않습니다. 둘째, .NET에서 사용되는 XPath 1.0에는 날짜 별 지원이 없습니다.
가장 쉬운 방법은하여 XDocument로 XML을로드하고 다음과 같은 코드를 사용하는 것은 (문서의 최상위 루트 노드 아래에 "메시지"일련의 노드를 가정) : - 또는
Func<XElement, DateTime> fn = e => DateTime.ParseExact(e.Element("date").Value, "dd.MM.yyyy", CultureInfo.InvariantCulture);
var messages = doc.Root.Elements("Message").OrderBy(fn);
foreach (var elem in messages)
{
Console.WriteLine(fn(elem));
}
경우 당신은 XML의 형식을 제어 할 수있는 경우
Func<XmlElement, DateTime> fn = e => DateTime.ParseExact(e.SelectSingleNode("date").InnerText, "dd.MM.yyyy", CultureInfo.InvariantCulture);
var messages = doc.DocumentElement.SelectNodes("Message")
.Cast<XmlElement>().OrderBy(fn);
foreach (var elem in messages)
{
Console.WriteLine(fn(elem));
}
내 서버에 .net 2.0이있어 LINQ를 사용할 수 없습니다. –
@Ibrahim : Windows 2000? 아니면 3.5를 설치하는 것을 방해하는 다른 것이 있습니까? – AnthonyWJones
나는 액세스 할 수 없으며 아무것도 설치하지 않습니다. 서버는 Windows 2008입니다. –
, 나는 그런 식으로 날짜를 ISO 8601의 날짜 형식을 변경 권 해드립니다 -이 :이 약간 추악한 코드가 작동을 XmlDocument를 고수하는 이유가 일반 문자열처럼 정렬 될 수 있습니다. 예를 들어 05.02.2010은 2010-05-02입니다. 또한 ISO 8601의 모호성이 덜합니다 (월전 또는 월의 전월)
XPathExpression 클래스를 사용하면 정렬 사양을 추가 할 수 있습니다. DDMMYYYY하지만
XPathDocument doc = new XPathDocument(@"..\..\XMLFile1.xml");
XPathNavigator nav = doc.CreateNavigator();
XPathExpression exp = nav.Compile("Messages/Message");
exp.AddSort(
"number(concat(substring(date, 7), substring(date, 4, 2), substring(date, 1, 2)))",
XmlSortOrder.Descending,
XmlCaseOrder.None,
null,
XmlDataType.Number
);
foreach (XPathNavigator msg in nav.Select(exp))
{
Console.WriteLine(
"{0}: {1}",
msg.SelectSingleNode("date").Value,
msg.SelectSingleNode("messagetext").Value
);
}
을 XMLFile1.xml 출력이
05.02.2010: Message 1
04.02.2010: Message 2
05.02.2009: Message 3
가정 된 날짜 형식입니다
<Messages>
<Message>
<messagetext>Message 2</messagetext>
<date>04.02.2010</date>
</Message>
<Message>
<messagetext>Message 1</messagetext>
<date>05.02.2010</date>
</Message>
<Message>
<messagetext>Message 3</messagetext>
<date>05.02.2009</date>
</Message>
</Messages>
인으로한다 : 여기 는 .NET 2.0에서 작동해야합니다 몇 가지 예제 코드 필요하다면 mmddyyyy를 원한다면 부분 문자열 표현을 변경할 수 있습니다.
+1 안녕하세요, Martin은 StackOverflow에 오신 것을 환영합니다. 여기에서 만나서 반가워요. 어디 있었 니? 오랜 시간 전에 훌륭한 XML 응답을 통해 여러분을 여기에서 만나기를 기대했습니다. ;) – AnthonyWJones
날짜 시간 형식 MM.dd.yyyy 또는 dd.MM.yyyy ?? – AnthonyWJones
Linq to XML을 사용하고 싶지 않은 이유가 있습니까? 일반적으로 코드는 XPath보다 훨씬 이해하기 쉽습니다. –
정렬 된 순서로 데이터를 읽으려고 하시겠습니까? 아니면 문서를 수정하고 다시 저장 하시겠습니까? –