C# 不使用C从XML获取值#
我有一个这样的XMLC# 不使用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
<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;
}
}
}