[英]Read XML using Linq without element names
我需要读取一个XML文件,尝试使用Linq,但是在到达后代时遇到一些问题。 我需要能够在不知道元素名称的情况下获得后裔。 这可能吗?
这是XML:
<Root>
<myResponse>
<GUID></GUID>
<TType code="1">myTType Value
<TSubType tc="1">TSubType Value</TSubType>
</TType>
<TDate>1999-09-19</TDate>
<TTime>16:00:00.0Z</TTime>
</myResponse>
</Root>
这是我的代码:
using (XmlReader nodeReader = XmlReader.Create(@"C:\Projects\GetXML\Test2.xml"))
{
nodeReader.MoveToContent();
XDocument xRoot = XDocument.Load(nodeReader, LoadOptions.SetLineInfo);
foreach (XElement e in xRoot.Elements("Root").DescendantsAndSelf())
Console.WriteLine("{0}{1}{2}",
("".PadRight(e.Ancestors().Count() * 2) + e.Name).PadRight(20), " = " ,
(e.Value).PadRight(5));
}
我的结果:
Root =
myTType Value
TSubType Value
1999-09-19
16:00:00.0Z
myResponse =
myTType Value
TSubType Value
1999-09-19
16:00:00.0Z
GUID =
TType = myTType Value
TSubType Value
TSubType = TSubType Value
TDate = 1999-09-19
TTime = 16:00:00.0Z
我期望的是:
Root =
myResponse =
GUID =
TType = myTType Value
TSubType = TSubType Value
TDate = 1999-09-19
TTime = 16:00:00.0Z
代替使用e.Value
,尝试使用:
string.Concat(e.Nodes().OfType<XText>().Select(t => t.Value))
。
您还可以使用:
e.Nodes().OfType<XText>().FirstOrDefault().Value
但是您冒着无法得到所有文本的风险(如果已拆分)。 例如:
<Root>
<myResponse>
<GUID></GUID>
<TType code="1">myTType Value
<TSubType tc="1">TSubType Value</TSubType>
Some more text
</TType>
<TDate>1999-09-19</TDate>
<TTime>16:00:00.0Z</TTime>
</myResponse>
</Root>
使用此XML,第一部分代码还将包含“更多文本”,而第二部分则不会。
这是我为获得与您期望的结果相似的格式化结果所做的工作。
XElement root = XElement.Load("xmlfile1.xml");
var allNodes = root.DescendantNodesAndSelf();
int maxNameLength = allNodes.OfType<XElement>()
.Select(x => x.Name.LocalName.Length)
.Max();
foreach (XNode x in allNodes)
{
XElement node = x as XElement;
if (node != null)
{
int numAncestors = node.Ancestors().Count();
XText textNode = node.Nodes().OfType<XText>().FirstOrDefault();
string text = "";
if (textNode != null)
text = textNode.Value.Trim();
string name = node.Name.LocalName;
// PadLeft() subtracts the string.Length from the padding
// so add its length to the padding amount
string left = name.PadLeft(numAncestors * 5 + name.Length);
// PadRight() wasn't giving the expected results
// so improvised with the following
string right = left + "".PadLeft(maxNameLength + 5 - name.Length);
Console.WriteLine("{0} = {1}", right, text);
}
}
结果:
Root =
myResponse =
GUID =
TType = myTType Value
TSubType = TSubType Value
TDate = 1999-09-19
TTime = 16:00:00.0Z
进行了编辑以计算所有名称的最大名称长度,以防您有较大的文件可以对它运行,并且有一些真正的长名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.