有没有办法从XML文件中删除命名空间垃圾?

15e*_*153 -1 xpath namespaces linq-to-xml

我需要从XML文件中选择一些节点(来自Silverlight XAP文件的AppNamespace.xaml,而不是它很重要),但该文件具有命名空间的东西,因此XPath不起作用.我可以浪费大部分时间试用和错误的XmlNamespaceManager的束缚和纪律噩梦,并最终得到无法容忍的脆弱代码,这些代码无法容忍输入文件中的最轻微变化(在生产代码中不是一个好主意),或者我可以使用荒谬的local-name()语法[1].

但是将XPath用作人类可读的查询语言会更方便,可以用来从任意XML文件返回指定的节点或属性值.

那么有没有办法从文件中删除线路噪音?还是我卡住了?Linq-to-XML的迷宫式是否真的是较小的邪恶?

[1]

//*[local-name() = 'Deployment']/*[local-name() = 'Deployment.Parts']/*[local-name() = 'AssemblyPart']/@*[local-name()='Name']
Run Code Online (Sandbox Code Playgroud)

更新

五年之后,除了一些想要使用更强大的东西的纤维外,我对每一种纤维都支持"迷宫般的低能"一词.

Lar*_*rsH 5

Ed,是使用System.Xml.XPath Extensions类的命名空间的示例.我修改它以匹配您正在查看的输入:

string markup = @"
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ...>
  <Deployment.Parts>
    <AssemblyPart x:Name="xamlName" Source="assembly" />
  </Deployment.Parts>
</Deployment>
";

XmlReader reader = XmlReader.Create(new StringReader(markup));
XElement root = XElement.Load(reader);

XmlNameTable nameTable = reader.NameTable;
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(nameTable);
nsm.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
nsm.AddNamespace("dep", "http://schemas.microsoft.com/client/2007/deployment");

IEnumerable<XElement> elements =
   root.XPathSelectElements("//dep:Deployment/dep:Deployment.Parts/dep:AssemblyPart/@x:Name", nsm);
foreach (XElement el in elements)
    Console.WriteLine(el);
Run Code Online (Sandbox Code Playgroud)

不是很复杂.显然你已经了解了XmlNamespaceManager,但我认为你对它的印象比它应得的还要糟糕.

当你说"绝对脆弱的代码无法容忍输入文件中的最轻微的变化"时,你是否指责一般的命名空间,或者XmlNamespaceManager?我没有看到任何一个让它变得脆弱......除了没有名称空间的XML处理代码之外,不会容忍输入文档中的某些更改,但会容忍其他文档.

对行业中的其他聪明人有一点尊重,花点时间了解一下设计背后的优势,然后你就会发现有很好的理由做了什么.

并非XML名称空间无法改进.然而,没有人能够制定出更好的标准并让社区接受它.