Получение значения Элемента в использовании Какао TouchXML

Слишком долго для комментария: я не могу дублировать поведение. Вот некоторые типы и модульный тест:

public interface ICommandHandler<T> where T : FooCommand { }
public class FooCommand { }
public class BarCommand : FooCommand { }
class FooCommandHandler : ICommandHandler<FooCommand> { }
class BarCommandHandler : ICommandHandler<BarCommand> { }
class BarCommandHandler2 : ICommandHandler<BarCommand> { }

[TestClass]
public class AutofacTests
{
    [TestMethod]
    public void ContainerResolvesExpectedDependency()
    {
        var container = GetContainer();
        var barCommandHandlers = container.Resolve<IEnumerable<ICommandHandler<BarCommand>>>()
            .ToArray();
        Assert.AreEqual(2, barCommandHandlers.Length);
        Assert.IsTrue(barCommandHandlers.Any(bch => bch is BarCommandHandler));
        Assert.IsTrue(barCommandHandlers.Any(bch => bch is BarCommandHandler2));
        Assert.IsFalse(barCommandHandlers.Any(bch => bch is FooCommandHandler));
    }

    private IContainer GetContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<FooCommandHandler>().As<ICommandHandler<FooCommand>>();
        builder.RegisterType<BarCommandHandler>().As<ICommandHandler<BarCommand>>();
        builder.RegisterType<BarCommandHandler2>().As<ICommandHandler<BarCommand>>();
        return builder.Build();
    }
}

Я регистрирую различные реализации ICommandHandler<T>. Я включил дополнительный - BarCommandHandler2 - чтобы я мог убедиться, что я получаю коллекцию нескольких реализаций из контейнера.

Тесты пройдены. Я регистрирую все три типа, но когда я решаю IEnumerable<ICommandHandler<BarCommand>>, я получаю только две реализации, которые ожидаю.

Это имеет смысл, потому что FooCommandHandler не реализует ICommandHandler<BarCommand>. Если контейнер разрешит это, то это будет ошибка.

Я бы порекомендовал рассмотреть ту часть, в которой вы решаете IEnumerable<ICommandHandler<BarCommand>>. Возможно, у вас есть некоторые дополнительные генерики на работе, и во время выполнения вы на самом деле решаете что-то еще.

12
задан Chris Hanson 11 February 2009 в 11:42
поделиться

3 ответа

Проблема состоит в том, что Ваш XML имеет пространство имен, что означает, что Ваш XPath на самом деле не соответствует. К сожалению, нет никакого отображения по умолчанию, и XPath на самом деле не определяет хороший способ обработать это внутренне, таким образом, Вы не можете зафиксировать его просто путем изменения XPath. Вместо этого необходимо сообщить интерпретатору, как Вы хотите отобразить его в своем XPath.

Это похоже на поддержку реализаций TouchXML этого через:

- (NSArray *)nodesForXPath:(NSString *)xpath namespaceMappings:(NSDictionary *)inNamespaceMappings error:(NSError **)error;

Таким образом, можно попробовать что-то как:

NSDictionary *mappings = [NSDictionary dictionaryWithObject:@"http://tempuri.org/webservices" forKey:@"tempuri"];
[myParser nodesForXPath:@"//tempuri:FundInfo" namespaceMappings:mappings error:&err];
25
ответ дан 2 December 2019 в 06:27
поделиться

Попробовать

NSArray *nodes = [myParser nodesForXPath:@"/FundInfo/*" error:&err];
-1
ответ дан 2 December 2019 в 06:27
поделиться

У меня была аналогичная проблема. ЛЮБОЙ выбор в XML, в котором указано пространство имен (xmlns = "http: // somenamespace"), приведет к тому, что узлы не будут найдены. Очень странно, учитывая, что он поддерживает дополнительные форматы пространств имен, такие как xmlns: somenamespace = "http: // somenamespace".

В любом случае, к далеко проще всего сделать замену строки и заменить xmlns = "http://tempuri.org/webservices на пустую строку.

В целом мне нравится touchxml, но я не могу поверить, что эта ошибка все еще существует.

0
ответ дан 2 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

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