[英]C# Read Xml - LinQ
I'm trying to read this particular xml and I got an "System.Xml.Linq.XContainer.Element(...) returned null." 錯誤。
XML
<P>
<W>
<WC>
<A>1</A>
<B>1</B>
<C>1</C>
</WC>
</W>
<Modules>
<Module Attr="ex">
<A>
<B>2</B>
<C>3</C>
<D>4</D>
<E>5</E>
<F>6</G>
<G>7</G>
</A>
</Module>
<Module Attr="ex2">
<A>
<C>3</C>
<D>4</D>
<E>5</E>
</A>
</Module>
</Modules>
<Modules>
<Module Attr="ex3">
<A>
<W>10</W>
<V>9</V>
</A>
</Module>
<Module Attr="XXXX">
<A>
<B>2</B>
<C>3</C>
<D>4</D>
<E>5</E>
<F>6</G>
<G>7</G>
</A>
</Module>
</Modules>
</P>
C#
XElement disXelement = XElement.Load($"PATH");
var modules = from module in disXelement.Element("Modules").Elements("Module")
where module.Attribute("Attr").Value == "XXXX"
select new
{
v = from s in module.Descendants()
select new
{
Ip = v.Element("F").Value,
Port = v.Element("G").Value
}
};
foreach (var item in modules)
{
foreach (var i in item.v)
{
MessageBox.Show(i.Ip);
MessageBox.Show(i.Port);
}
}
我想得到 F 和 G 的值。
我試過這個:
var modules2 = disXelement.Element("Modules").Elements("Module")
.Where((module) => module.Attribute("Attr").Value == "XXXX")
.Select((module) => new
{
v= module.Descendants().Select((v) => new
{
Ip = (string)v.Elements().Where(e => e.Name.LocalName == "F").First(),
Port = (string)v.Elements().Where(e => e.Name.LocalName == "G").First()
})
});
哪個工作(得到兩個消息框的值,但我收到一個錯誤:System.InvalidOperationException:'Sequence contains no elements' at v = module.Descendants()...
var doc = XDocument.Parse(xml);
foreach (XElement module in doc.Root.Elements())
{
foreach (XElement letterGroup in module.Elements())
{
foreach (XElement letter in letterGroup.Elements())
{
switch(letter.Name.LocalName)
{
case "F":
MessageBox.Show("IP: " + letter.Value);
break;
case "G":
MessageBox.Show("Port: " + letter.Value);
break;
}
}
}
}
}
這對我有用:
var modules = from module in disXelement.Element("Modules").Elements("Module")
where module.Attribute("Attr").Value == "XXXX"
select new
{
Ip = module.Descendants().Where(e => e.Name.LocalName == "F").First()?.Value,
Port = module.Descendants().Where(e => e.Name.LocalName == "G").First()?.Value
};
嘗試這個:
var modules = from module in disXelement.Elements("Module")
where module.Attribute("Attr").Value == "XXXX"
select new
{
v = new
{
Ip = module.Descendants("F").FirstOrDefault()?.Value,
Port = module.Descendants("G").FirstOrDefault()?.Value
}
};
foreach (var item in modules)
{
MessageBox.Show(item.v.Ip);
MessageBox.Show(item.v.Port);
}
給定您的示例數據,它應該為您提供兩個分別顯示 6 和 7 的MessageBoxes
。 它確實使用以下示例數據:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Modules>
<Module Attr="XXXX">
<A>
<B>2</B>
<C>3</C>
<D>4</D>
<E>5</E>
<F>6</F>
<G>7</G>
</A>
</Module>
</Modules>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.