C# 读取xml 特殊要求

huting8027 2014-06-17 04:35:05

//读取XML属性值,每个子级,增加一个加号(顺序必须按照层级关系)
//比如:A=+1,B=++2,C=+++3,B1=++22,C1=+++33,
//当前程序结果为:A=1,B=2,C=3,B1=22,C1=33,
private static StringBuilder str = new StringBuilder();
static void Main(string[] args)
{
string xmlPath = @"C:\Users\hu\Desktop\new 2.xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlPath);
WriteEachTable(xmlDoc.SelectSingleNode("DATA").ChildNodes);

}

private static void WriteEachTable(XmlNodeList choko)
{
foreach (XmlNode item in choko)
{
string Name = item.Attributes["id"].Value;
str.Append(item.Name + "=" + Name + ",");
if (item.ChildNodes.Count > 0)
WriteEachTable(item.ChildNodes);
}
}

<?xml version="1.0" encoding="utf-8"?>

<DATA>
<A id="1">
<B id="2">
<C id="3"/>
</B>
<B1 id="22">
<C1 id="33"/>
</B1>
</A>
</DATA>
...全文
146 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
huting8027 2014-06-18
  • 打赏
  • 举报
回复
多谢楼上各位,已解决问题。 是根据XmlNode获取XPath,然后判断当前节点深度,拼接字符串即可。 (最近google不好用,太可气了)

        private static string FindXPath(XmlNode node)
        {
            StringBuilder builder = new StringBuilder();
            while (node != null)
            {
                switch (node.NodeType)
                {
                    case XmlNodeType.Attribute:
                        builder.Insert(0, "/@" + node.Name);
                        node = ((XmlAttribute)node).OwnerElement;
                        break;
                    case XmlNodeType.Element:
                        int index = FindElementIndex((XmlElement)node);
                        builder.Insert(0, "/" + node.Name);
                        node = node.ParentNode;
                        break;
                    case XmlNodeType.Document:
                        return builder.ToString();
                    default:
                        throw new ArgumentException("Only elements and attributes are supported");
                }
            }
            throw new ArgumentException("Node was not in a document");
        }

        private static int FindElementIndex(XmlElement element)
        {
            XmlNode parentNode = element.ParentNode;
            if (parentNode is XmlDocument)
            {
                return 1;
            }
            XmlElement parent = (XmlElement)parentNode;
            int index = 1;
            foreach (XmlNode candidate in parent.ChildNodes)
            {
                if (candidate is XmlElement && candidate.Name == element.Name)
                {
                    if (candidate == element)
                    {
                        return index;
                    }
                    index++;
                }
            }
            throw new ArgumentException("Couldn't find element within parent");
        }
言多必失 2014-06-17
  • 打赏
  • 举报
回复
这个不是很难,加载xml后, 从叶子节点开始,递归就行。
exception92 2014-06-17
  • 打赏
  • 举报
回复
使用linq to xml 读取成集合,获取nodes节点,进行重新构造。
xdashewan 2014-06-17
  • 打赏
  • 举报
回复
引用 2 楼 huting8027 的回复:
想过使用当前层级,和根据父级几点数量去做。 但是 没找到相关函数可以获取当前节点层级
自己记录层级,每次递归自己增加层级,作为参数传递
saijie 2014-06-17
  • 打赏
  • 举报
回复
建议序列化的形式做 然后把对应的实体才衍生1个对应的属性
huting8027 2014-06-17
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
把当前层级作为参数丢进递归函数里滚,按照递归层数来判断拼接几个+号,或者直接把+号作为字符串参数直接参与递归,每递归一次增加一个+号
想过使用当前层级,和根据父级几点数量去做。 但是 没找到相关函数可以获取当前节点层级
xdashewan 2014-06-17
  • 打赏
  • 举报
回复
把当前层级作为参数丢进递归函数里滚,按照递归层数来判断拼接几个+号,或者直接把+号作为字符串参数直接参与递归,每递归一次增加一个+号

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧