繁体   English   中英

使用不带元素名称的Linq读取XML

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM