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");

これは、識別子ノードの1つを名前でターゲットにできるようにし、その名前の要素が確実に存在することを前提としています。それが当てはまらない場合、そのノードが見つからない場合、.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 に答える