【问题标题】:XML document doesn't return valueXML 文档不返回值
【发布时间】:2020-10-04 19:08:05
【问题描述】:

我有一个用 C# 编写的 XML 文档和控制台应用程序,我需要从 XML 中读取一些数据。为此,我尝试如下所示,但不是Aram,我什么也没得到。

var doc = new XmlDocument();
var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("rate", "http://www.w3.org/1999/XSL/Transform");
doc.Load(@"task.xml");
XmlNode root = doc.DocumentElement;
XmlNodeList myNodes = root.SelectNodes("Users/User/Name", nsmgr);
if (myNodes != null)
{
    foreach (var item in myNodes)
    {
        Console.WriteLine(item);
    }
}
else
{
    Console.WriteLine("Error!");
}

这也是 XML 文档。

<Users xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:User>
        <xsl:Name>Aram</xsl:Name>
        <xsl:Lastname>Vardanyan</xsl:Lastname>
        <xsl:Email>aram.vardanyan.y@gmail.com</xsl:Email>
        <xsl:Phone>077 195973</xsl:Phone>
   </xsl:User>
</Users>

【问题讨论】:

  • 你有一个错字Useres。还要检查更新的 XDocument 而不是 XmlDocument
  • @GazTheDestroyer 我更正了,但没有任何改变

标签: c# .net xml


【解决方案1】:

代码中有三个问题:

1 - 您没有 rate 命名空间,请将其更改为 xsl

XmlDocument doc = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");

2 - 前缀 UserName by xsl for SelectNodes

XmlNode root = doc.DocumentElement;
XmlNodeList myNodes = root.SelectNodes("/Users/xsl:User/xsl:Name", nsmgr);

3 - itemXmlNode 类型,那么Console.WriteLine(item) 将不会显示预期的结果,将var 更改为XmlNode 并显示InnerText

foreach (XmlNode item in myNodes)
{
    Console.WriteLine(item.InnerText);
}

整个代码:

XmlDocument doc = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");

doc.Load(@"task.xml");

XmlNode root = doc.DocumentElement;
XmlNodeList myNodes = root.SelectNodes("/Users/xsl:User/xsl:Name", nsmgr);
if (myNodes != null)
{
    foreach (XmlNode item in myNodes)
    {
        Console.WriteLine(item.InnerText);
    }
}
else
{
    Console.WriteLine("Error!");
}

结果

Aram

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    U 也可以通过 LINQ to XML 类实现相同的功能方式。查看documentation 以更深入地了解用于查询、修改等的丰富 API。

            //load the element users
            XElement element = XElement.Load("task.xml");
    
            //Get the namespace with prefix "xsl"
            XNamespace @namespace = element.GetNamespaceOfPrefix("xsl");
    
            //Get all childrens of Users element
            IEnumerable<XElement> users = element.Elements(XName.Get("User", @namespace.NamespaceName));
    
            foreach (XElement user in users)
            {
                XElement username = user.Element(XName.Get("Name", @namespace.NamespaceName));
                Console.WriteLine(username.Value);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多