我有一个项目,我正在采取一些特别丑陋的"实时"HTML,并使用HTML Agility Pack将其强制转换为正式的XML DOM.我希望能够做的是用Linq对XML进行查询,以便我可以清除我需要的位.我正在使用此处描述的方法将HtmlDocument解析为XDocument,但在尝试查询时我不知道如何处理命名空间.在一个特定的文档中,原始HTML实际上是格式不正确的XHTML,带有以下标记:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
Run Code Online (Sandbox Code Playgroud)
当试图从这个文档中查询时,似乎命名空间属性阻止我做类似的事情:
var x = xDoc.Descendants("div");
// returns null
Run Code Online (Sandbox Code Playgroud)
显然,对于那些"div"标签,只有LocalName是"div",但正确的标签名称是名称空间加上"div".我试图对XML命名空间的问题进行一些研究,似乎我可以通过这种方式来绕过命名空间:
var x =
(from x in xDoc.Descendants()
where x.Name.LocalName == "div"
select x);
// works
Run Code Online (Sandbox Code Playgroud)
但是,这似乎是一个相当hacky的解决方案,并没有正确解决名称空间问题.据我所知,一个正确的XML文档可以包含多个名称空间,因此处理它的正确方法应该是解析我正在查询的名称空间.还有其他人不得不这样做吗?我只是想让它变得复杂吗?我知道我可以通过坚持使用HtmlDocument并使用XPath查询来避免所有这些,但如果可能的话,我宁愿坚持我所知道的(Linq),我也更愿意知道我没有为更进一步的命名空间做好准备 - 相关问题在路上.
在这种情况下处理命名空间的正确方法是什么?
摘要
我最近与我的应用程序所依赖的框架的创建者进行了对话.在那次谈话中,他提到了一种说法,如果我将他的框架与我的应用程序捆绑在一起并将最终用户提供给我认为与我的代码一致的版本,那么它将使我的生活变得更简单.直觉上我一直试图避免这样做,事实上,我已经花了很多精力来分割我自己的代码,以便可以在不占用整个项目的情况下重新分配部分代码(即使很少有机会重复使用任何代码.它).然而,经过一段时间的考虑,我无法想出一个特别好的理由为什么我这样做.事实上,现在我已经考虑过了,我看到了一个非常引人注目的案例我所有较小的依赖项.我已经提出了一系列利弊,我希望有人可以指出我所遗漏的任何东西.
优点
缺点
笔记
作为参考,我的应用程序是用Python编写的,我所引用的依赖项是"轻量级",我的意思是小而不常用.(所以它们并不存在于所有机器上,甚至不存在于所有存储库中.)当我说"package with"我的应用程序时,我的意思是在我自己的源代码树下分发,而不是使用驻留在我的包中的脚本安装,所以会没有冲突版本的机会.我也只是在Linux上开发,所以不用担心Windows安装问题.
所有这些,我有兴趣听到有关包装依赖性更广泛(语言无关)问题的任何想法.有什么我想念的,或者这是一个简单的决定,我只是过度思考?
附录1
值得一提的是,我对下游包装商的需求也非常敏感.我希望尽可能简单地将应用程序包装在特定于发行版的Deb或RPM中.
换句话说:你写的代码不能失败.我有兴趣听取那些从事心脏监测,水测试,经济基础,导弹轨迹或航天飞机氧气浓度等项目的人的意见.
你是如何为编写这种代码做准备的:从方法上,智力上和情感上?
编辑
我已经标记了这个维基,以防代表问题让人们不予回复.我认为在这个问题上会有比现在更多的观点.
我正在使用PyGTK中的桌面应用程序,似乎遇到了我的文件组织的一些限制.到目前为止,我以这种方式构建了我的项目:
到目前为止,这已经相当不错了,但是此时application.py开始变得相当长.我查看了许多其他PyGTK应用程序,它们似乎有类似的结构问题.在某一点上,主模块开始变得非常长并且没有明显的方法将代码分解成更窄的模块而不牺牲清晰度和面向对象.
我已经考虑过将GUI作为主要模块,并为工具栏例程,菜单例程等提供单独的模块,但在那时我相信我将失去OOP的大部分好处并最终得到一切 - 引用 - 所有方案.
我应该只处理一个非常长的中央模块,还是有更好的方法来构建项目,这样我就不必那么依赖类浏览器了?
编辑我
好的,关于所有MVC的东西都是如此.我的代码中确实有一个粗略的MVC近似值,但不可否认,我可能通过进一步隔离模型和控制器来获得一些里程.但是,我正在阅读python-gtkmvc的文档(顺便说一句,这是一个很棒的发现,谢谢你引用它),我的印象是它不会解决我的问题,只需将其正式化即可.我的应用程序是单个glade文件,通常是单个窗口.因此无论我如何紧密地定义模块的MVC角色,我仍然会有一个控制器模块执行大部分操作,这正是我现在所拥有的.不可否认,我在适当的MVC实施上有点模糊,我将继续研究,但它没有
我应该考虑单独的控制器/视图对用于窗口的单独部分(工具栏,菜单等)吗?也许这就是我在这里所缺少的.似乎这就是S. Lott在他的第二个要点中提到的.
感谢到目前为止的回复.
我在实现它之前正确理解MVC的问题是第三个问题:
我有两个案例:
这些问题的相关之处在于它们都涉及模型 - 视图 - 控制器三元组之间的通信,这个主题在我的谷歌搜索中没有找到太多讨论.
解决此问题的显而易见的方法是将所有内容包装在顶级"应用程序"对象中,该对象处理模型之间的事务,并允许控制器调用彼此的方法.我已经看到了这个实现,但我不相信它是一个好主意.我还可以看到控制器观察多个模型并响应多个视图的可能性,但这似乎会变得非常混乱并且难以遵循.
关于如何最好地实施这种串扰的建议?我觉得这是一个非常明显的问题,但我一直无法找到一个记录完备的解决方案.
更广泛地说,如果有人有链接显示这些MVC问题的典型方法,我很乐意看到它.我没有太多运气找到可靠的,非平凡的参考资料.Python中的例子很可爱,但我很乐意阅读任何内容.
编辑1:
我看到下面说了一些非常有趣的事情,一般来说没有人对我所描述的方法有任何问题.它已经几乎是Vincent描述的FrontController设计的一种懒惰形式.我当然没有预见到实现这种模式会有任何问题,但是,似乎没有人真正解决过模型之间的沟通问题.所有答案似乎都是在单个模型中解决对象之间的通信问题.我更感兴趣的是为应用程序的单独组件维护单独的模型,因此我不会将50个状态属性填充到单个Model类中.我应该将它们作为子模型进行维护吗?
我正在开发一个允许用户上传文件的Django应用程序.我需要在将这些文件发送到Amazon S3之前对这些文件执行一些服务器端处理.在阅读了对这个问题和本博客文章的回复之后,我决定处理这个问题的最佳方式是让我的视图处理程序在Pyro远程对象上调用一个方法来异步执行处理,然后立即将Http 200返回给客户端.我有这个原型的,它似乎运作良好,但是,我也想保存处理的状态,使客户可以轮询应用程序,查看该文件已被处理并上传到S3.
我可以很容易地处理轮询,但我不确定存储进程状态的适当位置.它需要由Pyro进程写入并且可以通过我的轮询视图读取.
当然,还有一些数据完整性问题与数据库的解耦状态(如果服务器发生故障并且所有这些数据都在内存中会发生什么?).我将听到更多经验丰富的Web应用程序开发人员将如何处理这种状态处理.
我正在尝试使用Python的ctypes库来访问扫描库SANE中的一些方法.这是我第一次使用ctypes,第一次在一年多的时间内不得不处理C数据类型,所以这里有一个公平的学习曲线,但我认为即使没有这个,这个特殊的声明也会很麻烦:
extern SANE_Status sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only);
Run Code Online (Sandbox Code Playgroud)
首先,我已成功处理SANE_Status(一个枚举)和SANE_Bool(一个typedef c_int).那些都很简单.另一方面,第一个参数让我感到各种各样的悲伤.我不熟悉***开头的符号,到目前为止,我的示踪子弹只能产生垃圾数据.如何格式化此函数的输入,以便我可以读回我的Python结构对象列表?作为参考,被引用的C结构是:
typedef struct
{
SANE_String_Const name; /* unique device name */
SANE_String_Const vendor; /* device vendor string */
SANE_String_Const model; /* device model name */
SANE_String_Const type; /* device type (e.g., "flatbed scanner") */
}
SANE_Device;
Run Code Online (Sandbox Code Playgroud)
在哪里SANE_String_Const定义为c_char_p.
我的Python/ctypes版本对象是:
class SANE_Device(Structure):
_fields_ = [
("name", c_char_p),
("vendor", c_char_p),
("model", c_char_p),
("type", c_char_p)]
Run Code Online (Sandbox Code Playgroud)
关于我应该传递什么的建议,以便我可以从中得到预期的行为(结构对象列表)?所有答复都赞赏
更新1:
使用以下内容,我能够检索正确的SANE_Device Python结构:
devices …Run Code Online (Sandbox Code Playgroud) python ×4
amazon-s3 ×1
asynchronous ×1
components ×1
controller ×1
ctypes ×1
dependencies ×1
distribution ×1
django ×1
gtk ×1
html ×1
linq ×1
linq-to-xml ×1
model ×1
module ×1
namespaces ×1
organization ×1
packaging ×1
pointers ×1
pygtk ×1
pyro ×1
sane ×1
structure ×1
view ×1
xml ×1