Как я могу согласовать это, чтобы сделать универсальное преобразование в Nullable <T>?

XML имеет несколько пространств имен, но единственное пространство имен, о котором вам нужно беспокоиться, это http://www.smartraveller.gov.au/schema/rss/travel_advisories/.

Это потому, что единственными элементами на пути к вашей цели, которые находятся в пространстве имен, являются ta:level и ta:warning.

Пример ...

from lxml import etree
import requests

req = requests.request('GET', "https://smartraveller.gov.au/countries/documents/index.rss")
a = str(req.text).encode()

tree = etree.fromstring(a)

ns = {'ta': 'http://www.smartraveller.gov.au/schema/rss/travel_advisories/'}

e = tree.findall('channel/item/ta:warnings/ta:level', ns)
for i in e:
    print(i.text)

печатает ...

2/5
2/5
4/5
2/5
...and so on

Если вам нужен список, подумайте о переключении с findall() на xpath() ...

e = tree.xpath('channel/item/ta:warnings/ta:level/text()', namespaces=ns)
print(e)

печатает ...

['2/5', '2/5', '4/5', '2/5', and so on...]
46
задан TheSoftwareJedi 27 April 2009 в 14:31
поделиться

4 ответа

public static T To<T>(this IConvertible obj)
{
    Type t = typeof(T);
    Type u = Nullable.GetUnderlyingType(t);

    if (u != null)
    {
        return (obj == null) ? default(T) : (T)Convert.ChangeType(obj, u);
    }
    else
    {
        return (T)Convert.ChangeType(obj, t);
    }
}
96
ответ дан 26 November 2019 в 20:16
поделиться
public static T To<T>(this IConvertible obj) 
{
    Type t = typeof(T);
    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
        t = t.GetGenericArguments()[0];

    return (T)Convert.ChangeType(obj, t); 
}

Но если преобразование не удастся, оно выдаст исключение, не возвращая ноль, как и следовало ожидать.

4
ответ дан 26 November 2019 в 20:16
поделиться

Может быть, я упускаю суть, но в случае с Nullable, как ваш метод обеспечивает удобство чтения, производительность или обслуживание по сравнению с простым приведением, например (int ?) 1 ?

Помимо этого, возможно, еще один метод расширения?

public static T? ToNullable<T>(this T obj) where T:struct
{
    return (T?)obj;
}

Редактировать

После просмотра вашего редактирования почему предоставленная мной универсальная функция не работает вместо вашей функции < в этой строке кода? Вы не можете разрешить преобразование в Nullable для любого типа (именно поэтому ChangeType не работает), потому что этот универсальный принимает только типы значений. Вам придется либо использовать функцию, подобную той, которую я предоставил, либо изменить свою подпись на , чтобы принимать только типы значений и добавить специальный случай для Nullable ,

2
ответ дан 26 November 2019 в 20:16
поделиться

Это метод, который я сейчас использую (я получил ответ на SO ), он преобразует из строки в тип NULL:

    public static Nullable<T> ConvertToNullable<T>(this string s) where T : struct
    {
        if (!string.IsNullOrEmpty(s.Trim()))
        {
            TypeConverter conv = TypeDescriptor.GetConverter(typeof(Nullable<>).MakeGenericType(typeof(T)));
            return (Nullable<T>)conv.ConvertFrom(s);
        }
        return null;
    }
1
ответ дан 26 November 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: