2011-04-25 49 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;