小编The*_*mis的帖子

为什么 lxml.etree.SubElement() 允许创建不可序列化的元素?

from lxml import etree

element1 = etree.Element('{j:a}a', nsmap={None: 'j:a'})
etree.SubElement(element1, 'b')

element2 = etree.Element('{j:a}a', nsmap={None: 'j:a'})
etree.SubElement(element2, '{j:a}b')
Run Code Online (Sandbox Code Playgroud)

两个元素序列化为相同的

<a xmlns="j:a"><b/></a>

但两个元素的行为不同

element1.find('b')-> 返回元素

element2.find('b')-> 返回无

如果你反过来做

etree.fromstring("<a xmlns="j:a"><b/></a>")

你从 element2 得到表示,所以

element2.find('b')-> 返回无

<b/>这看起来是一致的,因为树中没有无名称空间,因为<b/>继承了默认名称空间<a/>

那么 element1 中表示的目的是什么?它似乎添加了一个无名称空间子元素<b/>并以这种方式运行。但是当序列化时,元素继承自<a>.

如果它无论如何都不序列化,为什么会存在?

python xml lxml xml-namespaces

6
推荐指数
1
解决办法
601
查看次数

如何在SimpleIOC中注册包含参数的类实例

我需要使用创建时传递给ViewModel的特定参数来创建ViewModel的实例。同时,此ViewModel实例应在SimpleIOC中注册

我认为这是解决问题的方法:

SimpleIoc.Register<TClass> Method (Func<TClass>, String, Boolean)
Run Code Online (Sandbox Code Playgroud)

将设置true为最后创建的最后一个参数。因此,如果我正确理解,则此方法希望引用将创建我的ViewModel实例的方法。

看起来这叫做ClassFactory。

我尝试自己做,但我得到的只是

cannot convert from <Class> to System.Func<Class>
Run Code Online (Sandbox Code Playgroud)

因此似乎即时传递的总是类的实例,而不是应该创建该类的方法。

有人可以举一个简短的例子,我如何使它工作

public class ClassFactory
{
    public ChatWindow CreateChatWindow(RosterItemX ri)
    {
        return new ChatWindow(ri);
    }
}


public class ViewModelLocator
{
.
.
.
.
    public static void CreateWindow(RosterItemX riv)
    {
        ClassFactory cf = new ClassFactory;

        SimpleIoc.Default.Register<ChatWindow>(cf.CreateChatWindow(ri), "key", true )
        var _messageWindow = new MessageWindow();
        _messageWindow.Show();
    }
}


class ChatMessage
{
    RosterItemX ri = new RosterItemX();
    ViewModelLocator.CreateWindow(ri);


}
Run Code Online (Sandbox Code Playgroud)

c# ioc-container mvvm-light

1
推荐指数
1
解决办法
2331
查看次数

标签 统计

c# ×1

ioc-container ×1

lxml ×1

mvvm-light ×1

python ×1

xml ×1

xml-namespaces ×1