2010-02-06 4 views
4

XML 문서가 있고 날짜 데이터가 포함되어 있습니다.XML 문서에서 Xpath 정렬

<Message> 
<messagetext>Testing purpose only</messagetext> 
<date>05.02.2010</date> 
</Message> 

가 나는 XPath는 키 그들을 정렬하려는 사람에 대한 PLS를 알고 있다면 내가 얻을 수있는 방법 나에게

덕분에 다음과 같이 XML로는 LINQ를 사용하여 할 수있는 모든 관련

+1

날짜 시간 형식 MM.dd.yyyy 또는 dd.MM.yyyy ?? – AnthonyWJones

+0

Linq to XML을 사용하고 싶지 않은 이유가 있습니까? 일반적으로 코드는 XPath보다 훨씬 이해하기 쉽습니다. –

+0

정렬 된 순서로 데이터를 읽으려고 하시겠습니까? 아니면 문서를 수정하고 다시 저장 하시겠습니까? –

답변

1

도움이됩니다. 난 당신이 형식 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> 
+0

내 서버에 .net 2.0이있어 LINQ를 사용할 수 없습니다. –

0

우선 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)); 
} 
+0

내 서버에 .net 2.0이있어 LINQ를 사용할 수 없습니다. –

+0

@Ibrahim : Windows 2000? 아니면 3.5를 설치하는 것을 방해하는 다른 것이 있습니까? – AnthonyWJones

+0

나는 액세스 할 수 없으며 아무것도 설치하지 않습니다. 서버는 Windows 2008입니다. –

0

, 나는 그런 식으로 날짜를 ISO 8601의 날짜 형식을 변경 권 해드립니다 -이 :이 약간 추악한 코드가 작동을 XmlDocument를 고수하는 이유가 일반 문자열처럼 정렬 될 수 있습니다. 예를 들어 05.02.2010은 2010-05-02입니다. 또한 ISO 8601의 모호성이 덜합니다 (월전 또는 월의 전월)

3

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를 원한다면 부분 문자열 표현을 변경할 수 있습니다.

+0

+1 안녕하세요, Martin은 StackOverflow에 오신 것을 환영합니다. 여기에서 만나서 반가워요. 어디 있었 니? 오랜 시간 전에 훌륭한 XML 응답을 통해 여러분을 여기에서 만나기를 기대했습니다. ;) – AnthonyWJones

관련 문제