2011-04-25 91 views
2

我有一個xml字符串保存在我試圖解析的遺留數據庫中。我可以得到字符串,但有2個問題獲取我需要的值。首先,一些示例xml。如何訪問子元素xml?

<?xml version="1.0" encoding="utf-16"?> 
<email> 
    <meta> 
     <smartForm> 
      <unit name="ForgotUsername" label="Forgot Username Email"> 
       <textBox name="FromEmail" label="From Email" type="Email" /> 
       <textBox name="FromName" label="From Name" type="100" /> 
       <textBox name="BccEmail" label="BCC" type="EmailList" /> 
       <textBox name="Subject" label="Subject" type="300" /> 
       <textBox2 name="TextBody" label="Body" type="Memo" /> 
      </unit> 
      <unit name="ForgotPassword" label="Forgot Password Email"> 
       <textBox name="FromEmail" label="From Email" type="Email" /> 
       <textBox name="FromName" label="From Name" type="100" /> 
       <textBox name="BccEmail" label="BCC" type="EmailList" /> 
       <textBox name="Subject" label="Subject" type="300" /> 
       <textBox2 name="TextBody" label="Body" type="Memo" /> 
      </unit> 
     </smartForm> 
    </meta> 
    <value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;root&gt;&lt;ForgotPassword BccEmail="[email protected]" FromEmail="[email protected]" FromName="password test" Subject="password test" TextBody="info" /&gt;&lt;ForgotUsername BccEmail="[email protected]" FromEmail="[email protected]" FromName="test" Subject="test" TextBody="test" /&gt;&lt;/root&gt;</value> 
</email> 

問題#1 - 我試圖使用XElement.Parse("string")然而解析XML,我不能得到<value>節點除非刪除了XML聲明(即前39個字符)。我希望不必這樣做,因爲這是一個脆弱的解決方案。

問題#2 - 一旦我有<value>元素的內容,並解析成一個的XElement,我希望查詢要麼<root>文檔元素的<ForgotUsername><ForgotPassword>子節點。當我得到.Elements()時,我被告知集合爲空。

我在做什麼錯?

價值的XML實體替換後:

<root> 
    <ForgotPassword BccEmail="[email protected]" FromEmail="[email protected]" FromName="password test" Subject="password test" TextBody="info" /> 
    <ForgotUsername BccEmail="[email protected]" FromEmail="[email protected]" FromName="test" Subject="test" TextBody="test" /> 
</root> 

更新: 試圖abatishchev的初步建議後 - 我改變了問題#1的代碼如下:

var xdoc = XDocument.Parse(contentXml); 
return (from element in xdoc.Elements("value") 
     select element.Value).FirstOrDefault(); 

根據提供的信息,它應該返回值節點中的字符串;但是,它返回null。 xdoc.Elements()(或者如上面的代碼片段所示)返回null。

+0

您是否嘗試過的'XDocument.Parse()''而不是XElement.Parse()'? – dahlbyk 2011-04-25 21:27:20

+0

對兩者都嘗試了同樣的結果。 – JamesEggers 2011-04-25 21:27:57

回答

1
  • 使用XDocument.Parse()創建文檔支持XML聲明
  • 爲了獲得單位,使用

    XDocument.Parse("...").Root // or Element("email") 
        .Elements("meta") 
         .Elements("smartForm") 
          .Elements("unit"); 
    
  • 或使用XPath:email/meta/smartForm/unit

  • 也可以使用查詢方式:

    var doc = XDocument.Parse("..."); 
    var q = from meta in doc.Root.Elements("meta") 
         from smartForm in meta.Elements("smartForm") 
         from unit in smartForm.Elements("unit") 
         select unit; 
    
+0

將它切換到XDocument.Parse()並調用xdoc.Elements(「meta」)後,它說Elements()返回null。 – JamesEggers 2011-04-25 21:32:49

+0

@James:對,我更新了我的回答 – abatishchev 2011-04-25 21:34:37

+0

爲主要問題添加了片段。 – JamesEggers 2011-04-25 21:38:30

1

對我來說,以下工作:

var xd = XDocument.Load("Test.xml"); 
var xv = XDocument.Parse((string)xd.Root.Element("value")); 
Console.WriteLine(xv.Root.Elements().Count()); 

輸出爲2,對於ForgotPassword和ForgotUsername。

0

#1:

XElement doc = XElement.Load(file); 
XElement valueElement = doc.Element("value"); 
string value = (string)valueElement;