2013-10-15 101 views
1

我试图解析一个XML文件(从VS 2012中的Dependacy Graph中获取它)。C#从根节点删除属性

这里是我的.xml文件

<?xml version="1.0" encoding="utf-8"?> 
<DirectedGraph xmlns="http://schemas.microsoft.com/vs/2009/dgml"> 
    <Nodes> 
     <Node Id="@101" Category="CodeSchema_ProjectItem" FilePath="$(ProgramFiles)\windows kits\8.0\include\um\unknwnbase.h" Label="unknwnbase.h" /> 
     <Node Id="@103" Category="CodeSchema_ProjectItem" FilePath="$(ProgramFiles)\windows kits\8.0\include\shared\wtypesbase.h" Label="wtypesbase.h" /> 

的样品在这里,我需要从将DirectedGraph删除属性 “的xmlns”。

这里是我的源代码,以消除这种

XmlNodeList rootNode = xmlDoc.GetElementsByTagName("DirectedGraph"); 
foreach (XmlNode node in rootNode) 
{ 
    node.Attributes.RemoveNamedItem("xmlns"); 
} 

但是这个代码不工作。如果我不删除这个,我不能选择节点像

XmlNodeList nodes = xmlDoc.DocumentElement.SelectNodes("/DirectedGraph/Nodes/Node"); 

我该怎么办?

+0

一个良好的XML应该有xmlns属性。 – Matthias

+0

是否删除名称空间的实际要求?不是你的要求只是为了能够解析XML文件?如果我是对的,你必须处理Xml命名空间。 –

回答

1

如果你喜欢,你可以工作命名空间,而不是删除声明:

var xml = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<DirectedGraph xmlns=""http://schemas.microsoft.com/vs/2009/dgml""> 
    <Nodes> 
     <Node Id=""@101"" Category=""CodeSchema_ProjectItem"" FilePath=""$(ProgramFiles)\windows kits\8.0\include\um\unknwnbase.h"" Label=""unknwnbase.h"" /> 
     <Node Id=""@103"" Category=""CodeSchema_ProjectItem"" FilePath=""$(ProgramFiles)\windows kits\8.0\include\shared\wtypesbase.h"" Label=""wtypesbase.h"" /> 
    </Nodes> 
</DirectedGraph>"; 

var doc = new XmlDocument(); 
doc.LoadXml(xml); 

var manager = new XmlNamespaceManager(doc.NameTable); 
manager.AddNamespace("d", "http://schemas.microsoft.com/vs/2009/dgml"); 

var nodes = doc.DocumentElement.SelectNodes("/d:DirectedGraph/d:Nodes/d:Node", manager); 
Console.WriteLine(nodes.Count); 
+0

谢谢!它完美的作品。 – ARN

1

用途:How to remove all namespaces from XML with C#?

private static XElement RemoveAllNamespaces(XElement xmlDocument) 
{ 
    if (!xmlDocument.HasElements) 
    { 
     XElement xElement = new XElement(xmlDocument.Name.LocalName); 
     xElement.Value = xmlDocument.Value; 
     foreach (XAttribute attribute in xmlDocument.Attributes()) 
      xElement.Add(attribute); 
      return xElement; 
    } 
    return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el))); 
} 

取之。

您可能还想查看:XmlSerializer: remove unnecessary xsi and xsd namespaces