0

以下函数不会返回我想要的节点的值,即“CompanyPolicyId”。我已经尝试了很多东西,但我仍然无法让它工作。有谁知道可能是什么问题?

 public void getpolicy(string rootURL, string policyNumber)
        {
            string basePolicyNumber = policyNumber.Remove(policyNumber.Length - 2);
            basePolicyNumber = basePolicyNumber + "00";

            using (WebClient client = new WebClient())
            {
                NetworkCredential credentials = new NetworkCredential();
                credentials.UserName = AppVars.Username;
                credentials.Password = AppVars.Password;
                client.Credentials = credentials;

                try
                {
                    XmlDocument doc = new XmlDocument();

                    doc.LoadXml(client.DownloadString(rootURL + basePolicyNumber));
                    XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
                    mgr.AddNamespace("zzzlocal", "http://com.zzz100.policy.data.local");

                    // Select the Identifier node with a 'name' attribute having an 'id' value
                    var node = doc.DocumentElement.SelectSingleNode("/InsurancePolicy/Indentifiers/Identifier[@name='CompanyPolicyId']", mgr);
                    if (node != null && node.Attributes["value"] != null)
                    {
                        // Pick out the 'value' attribute's value
                        var val = node.Attributes["value"].Value;

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            } 

这是 XML 文档:

<InsurancePolicy xmlns:zzzlocal="com.zzz100.policy.data.local" schemaVersion="2.7" variant="multiterm">
<Identifiers>
<Identifier name="VendorPolicyId" value="AAAA"/>
<Identifier name="CompanyPolicyId" value="BBBB"/>
<Identifier name="QuoteNumber" value="CCCC"/>
<Identifier name="pxServerIndex" value="DDDD"/>
<Identifier name="PolicyID" value="EEEE"/>
</Identifiers>
</InsurancePolicy>

在过去的 6 个小时里,我一直在尝试解决这个问题。老实说,这很糟糕。

4

2 回答 2

1

尝试使用这个

//Identifier[@name='CompanyPolicyId']"

或下面的不同方法

XElement rootElement = XElement.Load(<url here>);
string targetValue =
  (string)rootElement.Elements("Identifier")
  .Single(e => (string)e.Attribute("name") == "CompanyPolicyId")
  .Attribute("value");

这假设您希望能够按名称定位标识符节点之一,并且您确定会有一个具有该名称的元素。如果不是这样,则 .Single 调用将在未找到该节点时抛出异常。

如果您需要使用凭据并想使用 WebClient,那么您可以使用以下内容:(注意,我没有进行异常处理、检查流可用性或以其他方式处置/关闭流,这只是一个如何获取的示例它“工作”)

string uri = "> url here! <";
System.Net.WebClient wc = new System.Net.WebClient();
StreamReader sr = new StreamReader(wc.OpenRead(uri));
string xml = sr.ReadToEnd();
XElement rootElement = XElement.Parse(xml);
string targetValue =
  (string)rootElement.Elements("Identifier")
  .Single(e => (string)e.Attribute("name") == "CompanyPolicyId")
  .Attribute("value");
于 2012-08-08T20:44:24.543 回答
0

这是更简单的版本

    [Test]
    public void Test()
    {
        XElement root = XElement.Load(@"C:\1.xml");
        XElement identifier = GetIdentifierByName(root, "CompanyPolicyId");
        if (identifier == null)
        {
            return;
        }
        Console.WriteLine(identifier.Attribute("value"));
    }

    private static XElement GetIdentifierByName(XContainer root, string name)
    {
        return root.Descendants()
            .Where(x => x.Name.LocalName == "Identifier")
            .FirstOrDefault(x => x.Attribute("name").Value == name);
    }
}

控制台输出是BBBB

于 2012-08-08T20:46:07.943 回答