Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何访问子xml元素?_C#_Xml_Linq_Linq To Xml - Fatal编程技术网

C# 如何访问子xml元素?

C# 如何访问子xml元素?,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我有一个xml字符串保存在我试图解析的旧数据库中。我可以获取字符串,但在获取所需的值时有两个问题。首先是一些示例xml <?xml version="1.0" encoding="utf-16"?> <email> <meta> <smartForm> <unit name="ForgotUsername" label="Forgot Username Email">

我有一个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="test@test.com" FromEmail="test@test.com" FromName="password test" Subject="password test" TextBody="info" /&gt;&lt;ForgotUsername BccEmail="test@test.com" FromEmail="test@test.com" FromName="test" Subject="test" TextBody="test" /&gt;&lt;/root&gt;</value>
</email>
更新: 在尝试abatishchev的初始建议后,我将问题1的代码更改为:

var xdoc = XDocument.Parse(contentXml);
return (from element in xdoc.Elements("value")
        select element.Value).FirstOrDefault();
根据提供的信息,它应该返回值节点中的字符串;但是,它返回null。xdoc.Elements()
  • 使用
    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;
    

    • 以下几点对我很有用:

      var xd = XDocument.Load("Test.xml");
      var xv = XDocument.Parse((string)xd.Root.Element("value"));
      Console.WriteLine(xv.Root.Elements().Count());
      
      对于ForgotPassword和ForgotUsername,输出为2。

      对于#1:


      你试过
      XDocument.Parse()
      而不是
      XElement.Parse()
      ?试过这两种方法,结果都是一样的。在切换到XDocument.Parse()并调用xdoc.Elements(“meta”)后,它说Elements()返回null。在主要问题中添加了一段。@James:简单地说,在前面加上
      XDocument.Root
      。忘了根。我知道这很简单。谢谢
      var xd = XDocument.Load("Test.xml");
      var xv = XDocument.Parse((string)xd.Root.Element("value"));
      Console.WriteLine(xv.Root.Elements().Count());
      
      XElement doc = XElement.Load(file);
      XElement valueElement = doc.Element("value");
      string value = (string)valueElement;