【发布时间】:2010-10-26 16:44:44
【问题描述】:
我需要从 XML 文件中选择一些节点(AppNamespace.xaml 来自 Silverlight XAP 文件,这并不重要),但该文件包含命名空间内容,因此 XPath 不起作用。我可能会浪费一天的大部分时间反复试验 XmlNamespaceManager 的束缚和纪律噩梦,最终得到无法容忍输入文件中最轻微变化的脆弱代码(在生产代码中不是一个好主意),或者我可以使用可笑的 local-name() 语法 [1]。
但是将 XPath 用作人类可读的查询语言会更方便,它可用于从任意 XML 文件返回指定的节点或属性值。
那么有什么办法可以去除文件中的线路噪音?还是我卡住了? Linq-to-XML 迷宫般的低能真的是小恶魔吗?
[1]
//*[local-name() = 'Deployment']/*[local-name() = 'Deployment.Parts']/*[local-name() = 'AssemblyPart']/@*[local-name()='Name']
更新
五年后,我的每一根纤维都支持“迷宫般的愚蠢”一词,除了少数想要使用更强大的东西的纤维。
【问题讨论】:
-
看到这是一个 XAML 文件,使用的命名空间将被标准化,所以我不同意你的观点,即这会不必要地脆弱。此外,XML 命名空间的存在有一个非常真实的原因 - 不要只是将它们标记为“垃圾” - 学会利用它们来发挥自己的优势!
-
@marc_s,我完全同意 Plunkett 先生的观点。难以编写的代码往往很脆弱。代码稳定性是最重要的,忽略某些东西会变脆的唠叨感觉是愚蠢的。这并不是说你说的话没有任何价值,而是说“suck it up”更糟糕。
-
@Star:除了他没有说“接受它”(即,是的,这很糟糕,但忽略它并无论如何都要这样做)。他说 XML 命名空间是有原因的,您可以学习如何利用它们来发挥自己的优势。我已经这样做了,命名空间还不错;最不方便的部分是学习每个 XPath-to-my-code 接口如何处理它们。而且 XmlNamespaceManager 也不是那么糟糕……这是相当合乎逻辑的。 没有命名空间的混合 XML 词汇表是脆弱的。
-
@Ed,你在什么环境下开发,所以我们可以知道有哪些方法可用/实用?您提到了 linq-to-xml,但听起来您正在寻找它的替代品。我猜你使用的是 .NET?
-
LarsH,你正确推断出 .NET。
标签: xpath namespaces linq-to-xml