C# foreach xmlnode selectsinglenode在c中工作不正常#

C# foreach xmlnode selectsinglenode在c中工作不正常#,c#,xml,list,foreach,selectsinglenode,C#,Xml,List,Foreach,Selectsinglenode,我试图创建一个列表,其中列表中的每个项目都包含包的名称和保存位置。我创建了一个具有两个变量名称和位置的构造函数。然后我创建了一个由该构造函数组成的列表。我能抓到名字,但位置给了我一些麻烦。另外,如果节点没有位置,那么我希望列表中该项有一个空字符串。[请参见我想要澄清的结果列表] 我的XML: <project containsDynamicContent="true" xmlns="http://www.developer.cognos.com/schemas/bmt/60/1" xmln

我试图创建一个列表,其中列表中的每个项目都包含包的名称和保存位置。我创建了一个具有两个变量名称和位置的构造函数。然后我创建了一个由该构造函数组成的列表。我能抓到名字,但位置给了我一些麻烦。另外,如果节点没有位置,那么我希望列表中该项有一个空字符串。[请参见我想要澄清的结果列表]

我的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>
代码的其余部分:

    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
private List m_publishedCompathlist=new List();
私有列表m_pnalList=新列表();
Configuration.Instance.NSManager=新的XmlNamespaceManager(xmlDoc.NameTable);
Configuration.Instance.NSManager.AddNamespace(“cg”,mlDoc.DocumentElement.NamespaceURI);
XmlNodeList m_packageName=xmlDoc.DocumentElement.SelectNodes(//cg:project/cg:packages/cg:packages/cg:name),Configuration.Instance.NSManager);
string m_lastLocation=string.Empty;
foreach(m_packageName中的XmlNode名称)
{
PackageNamedLocation m_pnalClass=新的PackageNamedLocation();
m_pnalClass.PackageName=name.InnerText;
XmlNode m_lastPublishedCMPath=name.SelectSingleNode(“//cg:lastplishedcmpath”,Configuration.Instance.NSManager);
如果(m_lastPublishedCompath!=null)
{
m_lastLocation=m_lastPublishedCompath.InnerText;
}
其他的
{
m_lastLocation=“”;
}
m_pnalClass.LastLocation=m_LastLocation;
m_pnalList.Add(m_pnalClass);
}
我的结果清单:
[0]名称1
地点名称1
[1] 姓名2
地点名称1
[2] 名字3
地点名称1
我想要的结果列表:
[0]名称1
地点名称1
[1] 姓名2
“”[空字符串]
[2] 名字3
地点名称3

有人能帮帮我吗??是xpath还是代码本身?多谢各位

使用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>();

在您的代码中,您使用的是名称空间,但您的xml不包含任何名称空间。请以有帮助的方式展示完整的xml和所有名称空间!很抱歉,原始xml太大,无法放在这里,所以我自己创建了这个。是否还有可以使用xmldocument的地方?这段代码最初是由我的上级编写的,我无法更改xml的获取方式。抱歉,如果我听起来模棱两可,我对c#和xpath有点陌生。哈哈,嘿,我没有制定规则。然而,我确信这会奏效,但它仍然在向我展示我在问题中发布的结果。不是我想要的结果。@SahilGupta您确定使用了
名称。选择SingleNode
!我已经编辑了代码以反映我现在的情况。如您所见,我接受了您的建议并使用了name.SelectSingleNode
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>();
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);
.....