我不得不为面试写一些代码,打印出每个节点的name属性。我一开始走错了方向,所以没能完成。我想完成代码的编写,所以我创建了我的控制台应用程序,类似于他们有一个按钮事件在做什么。请让我知道你对代码的看法和我能做得更好。
class XMLRecursionReader
{
private StringBuilder _outputString = new StringBuilder();
private XmlNode _root;
public XMLRecursionReader(XmlDocument xDoc)
{
_root = xDoc.ChildNodes[1];
}
public string ReturnNameAsString (XmlNode node)
{
return node.Attributes["name"].InnerXml.ToString();
}
public void buildString (XmlNode node)
{
_outputString.AppendLine(ReturnNameAsString(node));
if (node.HasChildNodes)
{
foreach (XmlNode childNode in node.ChildNodes)
{
buildString(childNode);
}
}
}
public void PrintOutput ()
{
buildString(_root);
Console.WriteLine(_outputString.ToString());
Console.ReadLine();
}
}类似于我所编码的样本。但是代码需要是泛型的,并且能够根据输入的文档尽可能深入,但是结构总是类似于这一点。
<?xml version="1.0" encoding="UTF-8"?>
<report name="ReportName">
<agency name="agency1">
<office name="office1"></office>
<office name="office2"></office>
<office name="office3"></office>
</agency>
<agency name="agency2">
<office name="office1">
<agent name="agent Amy"></agent>
<address name="address line"></address>
</office>
<office name="office2"></office>
<office name="office3"></office>
</agency>
<agency name="agency3">
<office name="office1">
<agent name="agent Bettie">
<subagent name="sub-agent bob">
<phone name="456-789-1230"></phone>
</subagent>
<subagent name="sub-agent billy"></subagent>
</agent>
<address name="address line">
<faxnumber name="1234567890"></faxnumber>
</address>
</office>
<office name="office2"></office>
<office name="office3"></office>
</agency>
</report>
发布于 2017-10-16 16:41:34
还应补充如下:
ReturnNameAsString和buildString方法都可以是private,因为它们作为public API并不十分有用。ReturnNameAsString也可以是static,因为它不使用任何私有实例数据。XDocument更容易做到这一点,因为这样就可以欺骗,这实际上是一个一行: var name= XDocument .Parse(xml) .Root .Descendants() .Select(x => x.Attribute("name").Value) .ToList();https://codereview.stackexchange.com/questions/178049
复制相似问题