Выберите определенный диапазон элементов? - PullRequest
0 голосов
/ 15 августа 2011

Я хочу выбрать определенный диапазон элементов в моих файлах XML

Вот пример XML:

<urlset>
    <url>
        <loc>e1</loc>
        <priority>1</priority>
    </url>
    <url>
        <loc>e2</loc>
        <priority>2</priority>
    </url>
    <url>
        <loc>e3</loc>
        <priority>1</priority>
    </url>
    <url>
        <loc>e4</loc>
        <priority>3</priority>
    </url>
    <url>
        <loc>e4</loc>
        <priority>1</priority>
    </url>
    <url>
        <loc>e5</loc>
        <priority>2</priority>
    </url>
</urlset>

Как получить значение от e2 до e4?

Ответы [ 4 ]

2 голосов
/ 15 августа 2011
var doc = XDocument.Parse(xml);

var result = doc.Element("urlset").Elements("url")
    .SkipWhile(x => x.Element("loc").Value != "e2")
    .TakeWhile(x => x.Element("loc").Value != "e4");
2 голосов
/ 15 августа 2011
var result = urlset.Elements("url").Where(url =>
            url.Element("loc").Value.ToString().CompareTo("e2") >= 0 &&
            url.Element("loc").Value.ToString().CompareTo("e4") <= 0).Select(element => element.Element("loc").Value.ToString());

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

1 голос
/ 15 августа 2011

Вы можете использовать этот XPath:

//url[loc = 'e2' or 
    (preceding-sibling::url/loc = 'e2' and following-sibling::url/loc = 'e4')
]

Он выберет url с loc = e2, e3, e4

1 голос
/ 15 августа 2011

альтернативный способ:

var urls = from url in doc.Descendants("urlset").Elements("url")
    let str = Int32.Parse(url.Element("loc").Value.Replace("e",""))
    where str >= 2 && str <= 4  
    select url;

или на самом деле, более безопасный вариант, который не вызывает исключений, если loc не в форме "e + integer value" ( любезно предоставлено Marc Gravell ) будет:

int? TryParse(string s)
{
    int i;
    return int.TryParse(s, out i) ? (int?)i : (int?)null;
}

var urls = from url in doc.Descendants("urlset").Elements("url")
    let str = TryParse(url.Element("loc").Value.Replace("e",""))
    where str >= 2 && str <= 4  
    select url;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...