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...]
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);
}
}
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);
}
Но если преобразование не удастся, оно выдаст исключение, не возвращая ноль, как и следовало ожидать.
Может быть, я упускаю суть, но в случае с Nullable, как ваш метод обеспечивает удобство чтения, производительность или обслуживание по сравнению с простым приведением, например (int ?) 1
?
Помимо этого, возможно, еще один метод расширения?
public static T? ToNullable<T>(this T obj) where T:struct
{
return (T?)obj;
}
Редактировать
После просмотра вашего редактирования почему предоставленная мной универсальная функция не работает вместо вашей функции <
в этой строке кода? Вы не можете разрешить преобразование в Nullable для любого типа (именно поэтому ChangeType
не работает), потому что этот универсальный принимает только типы значений. Вам придется либо использовать функцию, подобную той, которую я предоставил, либо изменить свою подпись на
, чтобы принимать только типы значений и добавить специальный случай для Nullable
,
Это метод, который я сейчас использую (я получил ответ на 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;
}