2011-07-06 51 views
2

我有一个使用按钮生成文件的C#应用​​程序。目前,我想使用C#从XML文件中提取内容并将其作为字符串传递。例如在我的XML文件中,我有一个标签名称。我想用c#从XML文件中提取名称。我应该如何去实现它?以下是我目前的示例代码。整个过程必须使用按钮单击进行。从XML文件中提取内容

private void button1_Click(object sender, EventArgs e) 
{ 
    XElement xml = XElement.Load("C:\\Windows 7.xml"); 
    IEnumerable<XElement> propertyIDs = xml.Descendants("PropertyId"); 

    foreach (XElement child in xml.Elements()) 
    { 
     XElement row = child.Element("my:VM_Name"); 
     string test = xml.ToString(); 
     Console.WriteLine(test); 
    }  
} 

请访问本链接查看我的XML文件:http://pastebin.com/NKhBb4Zh

+0

您的代码看起来不错。我不明白这个问题。你想在“foreach”循环体中发生什么? –

+0

你想做什么不起作用?你有例外吗?什么东西看起来不正确? – Tipx

+0

@Kirk Woll使用Console.WriteLine(xml.Value);我能够在我的XML文件中显示内容。我想提取每个元素的内容并将其传递给c#中的字符串。 – dwyane

回答

2

我重写了你的例子,并改变它使用XmlDocument类。由于有我的命名空间,我不得不添加一个NameSpaceManager。使用这个你甚至可以选择一个spefic节点。

 string url = @"e:\temp\data.xml"; 

     XmlDocument doc = new System.Xml.XmlDocument(); 
     doc.Load(url); 
     XmlElement docElement = doc.DocumentElement; 

     /// loop through all childNodes 
     foreach (XmlNode childNode in docElement.ChildNodes) 
     { 
      Console.WriteLine(childNode.Name + ": " + childNode.InnerText); 
     } 

     XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); 
     mgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-05-27T03:57:48"); 

     /// use the given XmlNamespaceManager to select a specific element 
     XmlNode node = docElement.SelectSingleNode("my:VM_DiskSize", mgr); 
     /// use innerText for node text and value for attributes only 
     Console.WriteLine("\n" + node.Name + ": " + node.InnerText); 

心连心

+0

Console.WriteLine(“\ n”+ node.Name +“:”+ node.InnerText);给我错误。 NullException – dwyane

+0

啊我是sry - 现在重试 - 复制并粘贴错误 –

+0

sry在命名空间中有一个拼写错误..只是复制我的代码并尝试它 - 现在应该工作 –

1

您添加到您问题的意见是非常有益的。特别是:

我加入这个代码:

XElement name = xml.Element("my:VM_Name"); 
string test = xml.ToString(); 
Console.WriteLine(test); 

但我仍然无法从XML标签

解压出来的Windows 7:

我得到这个错误':'chara cter,十六进制值0x3A,不能包含在名称中。

让我们先从错误开始。正如你所做的那样,你不能传递给Element方法ns:name。使用此API时,必须通过XName类型以编程方式提供名称空间(ns)。因此,相反,该行应为:

XElement name = xml.Element(XName.Get("VM_Name", "my")); 

下面我们通过合格的名称作为实际XName而不是一个冒号分隔的字符串,因为它起源。注意订单;命名空间使用此语法来到。现在

,一旦你所做的这一切,在你有问题的另一条线是:

string test = xml.ToString(); 

这里,xml指的是你的根XML节点,而你真正想要的是,据推测,您刚查询的元素:xml.Element(XName.Get("VM_Name", "my"))。此外,要获取该节点的文本内容,您应该使用Value属性。我怀疑你真正想要的是:

string test = name.Value; 
+0

我将代码替换为private void button1_Click(object sender,EventArgs e) {Xelement xml = XElement.Load(“ C:\\ Windows 7.xml“); IEnumerable propertyIDs = xml.Descendants(“PropertyId”); (XElement propertyID in propertyIDs) { XElement name = xml.Element(XName.Get(“VM_Name”,“my”)); string test = name.Value; Console.WriteLine(test); }} – dwyane

+0

我在String test = name.Value下收到错误NullReferenceException; – dwyane

+0

@dwayne,如果找不到元素,'Element'方法将返回'null'。请*编辑*您的问题,并包括'C:\\ Windows 7.xml'的内容。 –