Linq, чтобы выбрать свойство из XML - PullRequest
1 голос
/ 22 января 2011

Это мой первый день работы с XML в контексте XPath, XQuery и Linq, и я не могу заставить ни один из них работать на меня.

Моя цель - извлечь значения для AgentGUIDи PublicKey в блобе XML.Ниже я использую запрос Linq.

        IEnumerable<string> publicKey =
            from item in xDoc.Descendants("PublicKey")
            select (string)item.????;

Вот XML-код, из которого я пытаюсь выбрать:

<AgentRegister xmlns="sampleURI">
server
<Servername>server</Servername>
<AgentGUID>1da3a4cf-73f2-4ee2-b8c1-cef428ad4b21</AgentGUID>
<PublicKey>&lt;RSAKeyValue&gt;&lt;Modulus&gt;5fuiFE74EKYUxFbSsAgeYQwyGzulQ+L1auBD1J/1gupF2s2NugpgZ6vqsi4o//vKdrKz7uhwDWeRUB5TR7hljNfOsJKbTV0sg4HywF93cyYDnfKz+2wCSxiZxAIWV8SMiui2QuD0LjbgPNGR/bBsY4GIl3eWbngjJjNEzVZq5RE=&lt;/Modulus&gt;&lt;Exponent&gt;AQAB&lt;/Exponent&gt;&lt;/RSAKeyValue&gt;</PublicKey>
<ApprovedByGUID>&lt;RSAKeyValue&gt;&lt;Modulus&gt;5fuiFE74EKYUxFbSsAgeYQwyGzulQ+L1auBD1J/1gupF2s2NugpgZ6vqsi4o//vKdrKz7uhwDWeRUB5TR7hljNfOsJKbTV0sg4HywF93cyYDnfKz+2wCSxiZxAIWV8SMiui2QuD0LjbgPNGR/bBsY4GIl3eWbngjJjNEzVZq5RE=&lt;/Modulus&gt;&lt;Exponent&gt;AQAB&lt;/Exponent&gt;&lt;/RSAKeyValue&gt;</ApprovedByGUID>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>2HuOAQAAxOTWz2JSq9+bJnWM8m8=</DigestValue></Reference>
</SignedInfo>
<SignatureValue>yGKq/p/JQCWSJtVKeRp4E5kHeFWVaoMFd/TbrYIm6k3nYBgr57gcEZjzvrLNsmKKaoaWspSqMzTDnrhER5AkfMi+4nhW0C6+vghNYU/jrEqT35Ov/B3aH1M41q07p3OXZc8dA1lzJ6Zh0zpx6Vd7faTfvuPqgIKmNOe07xGyP2Q=</SignatureValue>
<KeyInfo><KeyValue><RSAKeyValue>
<Modulus>5fuiFE74EKYUxFbSsAgeYQwyGzulQ+L1auBD1J/1gupF2s2NugpgZ6vqsi4o//vKdrKz7uhwDWeRUB5TR7hljNfOsJKbTV0sg4HywF93cyYDnfKz+2wCSxiZxAIWV8SMiui2QuD0LjbgPNGR/bBsY4GIl3eWbngjJjNEzVZq5RE=</Modulus>
<Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo>
</Signature>
</AgentRegister>

Как извлечь упомянутые значения из этого документа

1 Ответ

1 голос
/ 22 января 2011

Я бы сделал это, используя XDocument, но без LINQ, если вы не ожидаете, что общая структура документа изменится.

var publicKey = (string)xDoc.Root.Element("PublicKey");
var agentGuid = (Guid)xDoc.Root.Element("AgentGUID");

Если вы знаете, что существует только один экземпляр данного тегапроще получить этот экземпляр, чем вызывать метод, который выбирает все теги с данным именем, а затем извлекать единственное значение из полученного IEnumerable<>.

Однако ваш исходный код был почтиright.

    IEnumerable<string> publicKeys =
        from item in xDoc.Descendants("PublicKey")
        select (string)item;

Но тогда вам нужно выполнить это с помощью:

    string publicKey = publicKeys.First();

Тип XElement определяет пользовательские операторы преобразования для многих различных примитивных типов.У него есть свойство Value, которое возвращает строку, так что вы можете использовать его и вообще не иметь никакого приведения, если строка - то, что вам нужно - но часто удобнее просто привести XElement, содержащий значение непосредственно ктип данных вы хотите.

Обновление

Если вам нужно XmlDocument, вы можете преобразовать XDocument, как это ...

var doc = new XmlDocument();
doc.Load(xDoc.CreateReader());

Однако, вероятно, более эффективно просто использовать XmlDocument для начала, даже если это менее удобно.Один из способов получить те же значения из XmlDocument выглядит следующим образом:

var publicKey = doc.GetElementsByTagName("PublicKey")[0].InnerText;
var agentGuid = new Guid(doc.GetElementsByTagName("AgentGUID")[0].InnerText);
...