【问题标题】:foreach xmlnode selectsinglenode not working correctly in c#foreach xmlnode 选择单节点在 C# 中无法正常工作
【发布时间】:2013-07-16 17:36:53
【问题描述】:

我正在尝试创建一个列表,其中列表中的每个项目都包含包的名称和保存位置。我创建了一个具有两个变量名称和位置的构造函数。然后我创建了一个包含该构造函数的列表。我能够抓住这个名字,但这个位置给我带来了一些麻烦。此外,如果节点没有位置,那么我想要列表中该项目的空字符串。 [请参阅我想要澄清的结果列表]。

我的 XML:

<project containsDynamicContent="true" xmlns="http://www.developer.cognos.com/schemas/bmt/60/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.developer.cognos.com/schemas/bmt/60/1 BMTModelSpecification.xsd">
    <packages>
        <package>
            <name>name1</name>
            <lastPublishedCMPath>Location_name1</lastPublishedCMPath>
        </package>
    </packages>
    <packages>
        <package>
            <name>name2</name>
        </package>
    </packages>
    <packages>
        <package>
            <name>name3<name>
            <lastPublishedCMPath>Location_name3</lastPublishedCMPath>
        </package>
    </packages>
</project>

我的 C# 代码: 构造函数:

public class PackageNameAndLocation
    {
        public string PackageName { get; set; }
        public string LastLocation { get; set; }
    }

其余代码:

    private List<string> m_publishedCMPathList = new List<string>();
    private List<PackageNameAndLocation> m_pnalList = new List<PackageNameAndLocation>();

    Configuration.Instance.NSManager = new XmlNamespaceManager(xmlDoc.NameTable);
    Configuration.Instance.NSManager.AddNamespace("cg", mlDoc.DocumentElement.NamespaceURI);

    XmlNodeList m_packageName = xmlDoc.DocumentElement.SelectNodes("//cg:project/cg:packages/cg:package/cg:name", Configuration.Instance.NSManager);
    string m_lastLocation = string.Empty;

foreach (XmlNode name in m_packageName)
            {
                PackageNameAndLocation m_pnalClass = new PackageNameAndLocation();
                m_pnalClass.PackageName  = name.InnerText;
                XmlNode m_lastPublishedCMPath = name.SelectSingleNode("//cg:lastPublishedCMPath", Configuration.Instance.NSManager);
                if(m_lastPublishedCMPath != null)
                {
                    m_lastLocation = m_lastPublishedCMPath.InnerText;
                }
                else
                {
                    m_lastLocation = "";

                }
                m_pnalClass.LastLocation = m_lastLocation;
                m_pnalList.Add(m_pnalClass);
            }

My Result List:
[0] name1
    location_name1
[1] name2
    location_name1
[2] name3
    location_name1

Result List I want:
[0] name1
    location_name1
[1] name2
    "" [Empty String]
[2] name3
    location_name3

有人可以帮帮我吗?是 xpath 还是代码本身的问题?非常感谢!

【问题讨论】:

  • 在您的代码中,您正在使用命名空间,但您的 xml 不包含任何命名空间。请显示您的完整 xml 与所有命名空间
  • 希望对您有所帮助!抱歉,原来的 xml 太大,无法放在这里,所以我自己创建了这个。

标签: c# xml list foreach selectsinglenode


【解决方案1】:

使用 linq2xml..它使用简单..

XElement doc=XElement.Load("yourXml.xml");
XNamespace ns="http://www.developer.cognos.com/schemas/bmt/60/1";

m_pnalList=doc.Descendants(ns+"package")
              .Select(d=>
                  new PackageNameAndLocation
                  {
                       PackageName=(string)d.Element(ns+"name"),
                       LastLocation=(string)d.Element(ns+"lastPublishedCMPath")
                  }
                  )
               .ToList<PackageNameAndLocation>();

如果你想坚持 xmldocument!

1>你不需要PackageNameAndLocation中的方法..只需保留属性

2>应该这样做

XmlNodeList m_package = xmlDoc.DocumentElement.SelectNodes("//cg:package", Configuration.Instance.NSManager);
string m_lastLocation = string.Empty;

foreach (XmlNode package in m_package)
            {
                PackageNameAndLocation m_pnalClass = new PackageNameAndLocation();
                m_pnalClass.PackageName  = package.SelectSingleNode("//cg:name").InnerText;
                XmlNode m_lastPublishedCMPath =  name.SelectSingleNode("//cg:lastPublishedCMPath", Configuration.Instance.NSManager);
.....

【讨论】:

  • 还有什么可以让我使用 xmldocument 吗?这段代码最初是由我的上级编写的,我无法更改抓取 xml 的方式。对不起,如果我听起来模棱两可,我对 c# 和 xpath 有点陌生。
  • 哈哈,我不制定规则。但是,我确信这会起作用,但它仍然向我展示了我在问题中发布的结果。不是我想要的结果。
  • @SahilGupta 你确定你用过name.SelectSingleNode!那应该有用
  • 我已经编辑了代码以反映我现在所拥有的。如您所见,我接受了您的建议并使用了 name.SelectSingleNode
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2014-10-31
  • 2017-04-07
  • 2013-03-23
相关资源
最近更新 更多