无法使用 Linq 访问 XML 文件的特定块
Cannot access to a specific block of XML file with Linq
我正在尝试获取 XML 的特定块,我正在使用函数加载来获取我所有的 XML 文件并且它工作正常。当我调试时,我可以看到所有文件。问题是关于我何时尝试获取 xml.
的特定值
我正在使用 LINQ 库的 XElement。所以,这是我的 xml 文件的示例:
-<Mission xmlns:z="http:..." xmlns:i="http:..." xmlns="http:..." z:Id="1">
+<ActiveBullsEye z:Id="2" i:type="BullsEye">
-<ActiveFlightPlan z:Id="7" i:type="FlightPlan">
<AIRTAC z:Id="8"/>
<Active>false</Active>
-<Aircraft z:Id="9" i:type="a:Tanker" xmlns:a="http:...">
-<ACColor xmlns:b="http:...">
<b:A>255</b:A>
<b:B>169</b:B>
<b:G>169</b:G>
<b:R>169</b:R>
<b:ScA>1</b:ScA>
<b:ScB>0.396755248</b:ScB>
<b:ScG>0.396755248</b:ScG>
<b:ScR>0.396755248</b:ScR>
我需要访问块 (ACColor),然后执行 for 语句以获取所有这些值。但我正在尝试这样的事情,但对我不起作用:
XElement xdocument = XElement.load(filepath) //This works
XElement missionBlock = xdocument.Element("Mission") //(ERROR) This not get Mission tag
foreach( XElement acColor in missionBlock.Elements("ACColor") ) { // (ERROR) Not found ACColor
...
}
你能帮我访问ACColor节点的所有值吗?
像下面的代码一样使用字典:
XDocument doc = XDocument.Load(FILENAME);
XElement color = doc.Descendants().Where(x => x.Name.LocalName == "ACColor").FirstOrDefault();
Dictionary<string, string> dict = color.Elements().GroupBy(x => x.Name.LocalName, y => (string)y)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
试试这个:
class Program
{
static void Main(string[] args)
{
var xdocument = XDocument.Load(@"c:\temp\sta01\test.xml");
var xmlns = "http:...";
var missionBlock = xdocument.Root;
foreach (
var acColor
in missionBlock
.Elements(XName.Get("ActiveBullsEye", xmlns))
.Elements(XName.Get("ActiveFlightPlan", xmlns))
.Elements(XName.Get("Aircraft", xmlns))
.Elements(XName.Get("ACColor", xmlns)))
{
var channel = acColor.Element(XName.Get("A", xmlns));
Console.WriteLine($"A: {channel.Value}");
}
Console.ReadLine();
}
}
它适用于此文档:
<Mission xmlns:z="http:..." xmlns:i="http:..." xmlns="http:..." z:Id="1">
<ActiveBullsEye z:Id="2" i:type="BullsEye">
<ActiveFlightPlan z:Id="7" i:type="FlightPlan">
<AIRTAC z:Id="8"/>
<Active>false</Active>
<Aircraft z:Id="9" i:type="a:Tanker" xmlns:a="http:...">
<ACColor xmlns:b="http:...">
<b:A>255</b:A>
<b:B>169</b:B>
<b:G>169</b:G>
<b:R>169</b:R>
<b:ScA>1</b:ScA>
<b:ScB>0.396755248</b:ScB>
<b:ScG>0.396755248</b:ScG>
<b:ScR>0.396755248</b:ScR>
</ACColor>
</Aircraft>
</ActiveFlightPlan>
</ActiveBullsEye>
</Mission>
XElement xDocument = XElement.load(filepath); // This works
var ns = xDocument.GetDefaultNamespace();
in missionBlock
.Elements(ns + "ActiveBullsEye")
并获取例如 z:Id
的值:
var z = xml.GetNamespaceOfPrefix("z");
var id = (string)xElement.Attribute(z + "Id");
从字符串创建命名空间时不要使用 var:
var ns1 = "http://something"; // ns1 is a string
XNamespace ns2 = "http://something"; // ns2 is a namespace
您确实需要一个命名空间 z 才能使 z + "Id"
正常工作。
我正在尝试获取 XML 的特定块,我正在使用函数加载来获取我所有的 XML 文件并且它工作正常。当我调试时,我可以看到所有文件。问题是关于我何时尝试获取 xml.
的特定值我正在使用 LINQ 库的 XElement。所以,这是我的 xml 文件的示例:
-<Mission xmlns:z="http:..." xmlns:i="http:..." xmlns="http:..." z:Id="1">
+<ActiveBullsEye z:Id="2" i:type="BullsEye">
-<ActiveFlightPlan z:Id="7" i:type="FlightPlan">
<AIRTAC z:Id="8"/>
<Active>false</Active>
-<Aircraft z:Id="9" i:type="a:Tanker" xmlns:a="http:...">
-<ACColor xmlns:b="http:...">
<b:A>255</b:A>
<b:B>169</b:B>
<b:G>169</b:G>
<b:R>169</b:R>
<b:ScA>1</b:ScA>
<b:ScB>0.396755248</b:ScB>
<b:ScG>0.396755248</b:ScG>
<b:ScR>0.396755248</b:ScR>
我需要访问块 (ACColor),然后执行 for 语句以获取所有这些值。但我正在尝试这样的事情,但对我不起作用:
XElement xdocument = XElement.load(filepath) //This works
XElement missionBlock = xdocument.Element("Mission") //(ERROR) This not get Mission tag
foreach( XElement acColor in missionBlock.Elements("ACColor") ) { // (ERROR) Not found ACColor
...
}
你能帮我访问ACColor节点的所有值吗?
像下面的代码一样使用字典:
XDocument doc = XDocument.Load(FILENAME);
XElement color = doc.Descendants().Where(x => x.Name.LocalName == "ACColor").FirstOrDefault();
Dictionary<string, string> dict = color.Elements().GroupBy(x => x.Name.LocalName, y => (string)y)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
试试这个:
class Program
{
static void Main(string[] args)
{
var xdocument = XDocument.Load(@"c:\temp\sta01\test.xml");
var xmlns = "http:...";
var missionBlock = xdocument.Root;
foreach (
var acColor
in missionBlock
.Elements(XName.Get("ActiveBullsEye", xmlns))
.Elements(XName.Get("ActiveFlightPlan", xmlns))
.Elements(XName.Get("Aircraft", xmlns))
.Elements(XName.Get("ACColor", xmlns)))
{
var channel = acColor.Element(XName.Get("A", xmlns));
Console.WriteLine($"A: {channel.Value}");
}
Console.ReadLine();
}
}
它适用于此文档:
<Mission xmlns:z="http:..." xmlns:i="http:..." xmlns="http:..." z:Id="1">
<ActiveBullsEye z:Id="2" i:type="BullsEye">
<ActiveFlightPlan z:Id="7" i:type="FlightPlan">
<AIRTAC z:Id="8"/>
<Active>false</Active>
<Aircraft z:Id="9" i:type="a:Tanker" xmlns:a="http:...">
<ACColor xmlns:b="http:...">
<b:A>255</b:A>
<b:B>169</b:B>
<b:G>169</b:G>
<b:R>169</b:R>
<b:ScA>1</b:ScA>
<b:ScB>0.396755248</b:ScB>
<b:ScG>0.396755248</b:ScG>
<b:ScR>0.396755248</b:ScR>
</ACColor>
</Aircraft>
</ActiveFlightPlan>
</ActiveBullsEye>
</Mission>
XElement xDocument = XElement.load(filepath); // This works
var ns = xDocument.GetDefaultNamespace();
in missionBlock
.Elements(ns + "ActiveBullsEye")
并获取例如 z:Id
的值:
var z = xml.GetNamespaceOfPrefix("z");
var id = (string)xElement.Attribute(z + "Id");
从字符串创建命名空间时不要使用 var:
var ns1 = "http://something"; // ns1 is a string
XNamespace ns2 = "http://something"; // ns2 is a namespace
您确实需要一个命名空间 z 才能使 z + "Id"
正常工作。