C# 不使用C从XML获取值#

C# 不使用C从XML获取值#,c#,xml,linq,C#,Xml,Linq,我有一个这样的XML <language code="eng"> <label lang="tr">İngilizce</label> <label lang="en">English</label> </language> 但我需要用相同的代码获取label lang=“tr”和label lang=“en”内部文本(Ingilizce,英语)。不是我干的 如何更改代码?谢谢你的帮助。:) 编辑: var la

我有一个这样的XML

<language code="eng">
  <label lang="tr">İngilizce</label>
  <label lang="en">English</label>
</language>
但我需要用相同的代码获取label lang=“tr”和label lang=“en”内部文本(Ingilizce,英语)。不是我干的

如何更改代码?谢谢你的帮助。:)

编辑:

 var languageCodeAndValue = doc.Root
                  .Elements("language")
                  .SelectMany(x => x.Elements("label").Select(item => new Tuple<string, string>(item.Attribute("lang").Value, item.Value)))
                  .ToList();
但我需要

tur,tr,Turkce
tur,en,Turkish
eng,tr,Ingilizce
eng,en,English

如果我完全理解你的意思,就试试这个:

var languageCodeAndValue = doc.Root
                      .Elements("language")
                      .SelectMany(x => x.Elements("label").Select(item => new Tuple<string, string, string>(x.Attribute("code").Value, item.Attribute("lang").Value, item.Value)))
                      .ToList();

试着这样做:

var languageCode = doc.Root
                          .Elements("language")
                          .Select(x => new XmlModel
                          {
                              Code = (string) x.Attribute("code"),
                              lables = x.Elements().Select(y => new {
                                   tr = y.Where(z => (string)z.Attribute("lang") == "tr").Select(z => (string)),
                                   en = y.Where(z => (string)z.Attribute("lang") == "en").Select(z => (string))
                               }).ToList()
                          }).ToList();

另一种解析xml的方法是使用
XmlSerializer
。如果将xml复制到剪贴板并选择“过去特殊”>“将xml粘贴为类”,Visual Studio可以基于xml为您创建类。 然后可以对xml进行反序列化,您将拥有一个
语言
对象,该对象具有
标签的数组

void Main()
{
    string xml = @"<language code=""eng"">
      <label lang=""tr"">İngilizce</label>
       <label lang=""en"">English</label>
      </language>";

    XmlSerializer ser = new XmlSerializer(typeof(language));
    using (MemoryStream ms = new MemoryStream())
    {
        XDocument.Parse(xml).Save(ms);
        ms.Position = 0;
        var lang = (language)ser.Deserialize(ms);

        Console.WriteLine(lang.code);
        foreach (languageLabel lbl in lang.label)
        {
            Console.WriteLine(lbl.lang);
            Console.WriteLine(lbl.Value);
        }
    }
}

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class language
{

    private languageLabel[] labelField;

    private string codeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("label")]
    public languageLabel[] label
    {
        get
        {
            return this.labelField;
        }
        set
        {
            this.labelField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string code
    {
        get
        {
            return this.codeField;
        }
        set
        {
            this.codeField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class languageLabel
{

    private string langField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string lang
    {
        get
        {
            return this.langField;
        }
        set
        {
            this.langField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}
void Main()
{
字符串xml=@“
İngilice
英语
";
XmlSerializer ser=新的XmlSerializer(类型(语言));
使用(MemoryStream ms=new MemoryStream())
{
XDocument.Parse(xml).Save(ms);
ms.Position=0;
var lang=(语言)序列反序列化(ms);
Console.WriteLine(lang.code);
foreach(lang.label中的languageLabel lbl)
{
Console.WriteLine(lbl.lang);
控制台写入线(磅值);
}
}
}
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace=”“,IsNullable=false)]
公共部分类语言
{
专用语言标签[]labelField;
私有字符串码域;
/// 
[System.Xml.Serialization.XmlElementAttribute(“标签”)]
公共语言标签[]标签
{
得到
{
把这个还给拉伯菲尔德;
}
设置
{
this.labelField=值;
}
}
/// 
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字符串代码
{
得到
{
返回此.codeField;
}
设置
{
this.codeField=值;
}
}
}
/// 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
公共部分类语言标签
{
私有字符串字段;
私有字符串值字段;
/// 
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字符串语言
{
得到
{
返回此文件。langField;
}
设置
{
this.langField=值;
}
}
/// 
[System.Xml.Serialization.XmlTextAttribute()]
公共字符串值
{
得到
{
返回此.valueField;
}
设置
{
this.valueField=值;
}
}
}

这对我很有用。如何在此linq中添加语言代码?请你也帮帮忙好吗?我需要在这个列表中加上’s eng’。@CanYurdugül很抱歉,但我还是不明白你想要什么。你们能给我看一个输出的例子或者编辑你们的问题吗?好的。我会为你编辑这个问题。请稍等。编辑过的答案的输出是土耳其语,tr,Türkçe土耳其语,恩,土耳其语不正确。我需要tur,tr,Türkçe tur,恩,Turkish你没有发布你的类XmlModel,所以不可能给出完美的答案。我发布了XML的示例节点,我有一个正确的答案。这意味着,这是可能的。上的xml有两个属性,而预期结果显示三个属性,如:tur、tr、Turkce。Turkce不是xml格式,它的格式与eng、tr、Ingilizce eng、en、English dummy相同。
foreach (var value in languageCodeAndValue)
{
    Console.WriteLine(value.Item1);
    Console.WriteLine(value.Item2);
    Console.WriteLine(value.Item3);
}
var languageCode = doc.Root
                          .Elements("language")
                          .Select(x => new XmlModel
                          {
                              Code = (string) x.Attribute("code"),
                              lables = x.Elements().Select(y => new {
                                   tr = y.Where(z => (string)z.Attribute("lang") == "tr").Select(z => (string)),
                                   en = y.Where(z => (string)z.Attribute("lang") == "en").Select(z => (string))
                               }).ToList()
                          }).ToList();
void Main()
{
    string xml = @"<language code=""eng"">
      <label lang=""tr"">İngilizce</label>
       <label lang=""en"">English</label>
      </language>";

    XmlSerializer ser = new XmlSerializer(typeof(language));
    using (MemoryStream ms = new MemoryStream())
    {
        XDocument.Parse(xml).Save(ms);
        ms.Position = 0;
        var lang = (language)ser.Deserialize(ms);

        Console.WriteLine(lang.code);
        foreach (languageLabel lbl in lang.label)
        {
            Console.WriteLine(lbl.lang);
            Console.WriteLine(lbl.Value);
        }
    }
}

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class language
{

    private languageLabel[] labelField;

    private string codeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("label")]
    public languageLabel[] label
    {
        get
        {
            return this.labelField;
        }
        set
        {
            this.labelField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string code
    {
        get
        {
            return this.codeField;
        }
        set
        {
            this.codeField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class languageLabel
{

    private string langField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string lang
    {
        get
        {
            return this.langField;
        }
        set
        {
            this.langField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}