使用c#解析xml动态标签

本文关键字:动态 标签 xml 解析 使用 | 更新日期: 2023-09-27 18:14:57

我是一个c#学习者,现在我一直面临这样的情况:

这是我正在处理的xml示例

<User_Security>
  <bob>
    <group>s1, a2, b3</group>
  </bob>
  <alice>
    <group>y3, c2</group>
  </alice>
</User_Security>

可以看到它使用people作为标签名而不是标签数据,所以我不能使用XmlDocument

的getElementByTagName()

如何解析名称和它们所属的组?

使用c#解析xml动态标签

编辑:我知道这并没有回答如何解决当前XML问题的确切问题;但是正如许多人所评论的那样,您的XML容易变形,并且会给您带来很多问题。我使用XML的时间比任何一个理智的人都要长得多,我提供的建议将为您省去很多麻烦。

祝你好运!

我要做的是使用属性和XSD模式。

让它像这样

<User_Security>
    <user name="Bob">
        <group>c1</group>
        <group>c2</group>
        <group>c3</group>
    </user>
    <user name="Alice">
        <group>c1</group>
        <group>c2</group>
    </user>
</User_Security>

您可以使用XSD表示该文件允许在一个用户中包含多个组;我会找一个例子,并在编辑中发布。

编辑:一个XSD片段看起来像这样,但你必须了解整个概念:
<xs:element name="user">
    <xs:attributename="name" type="xs:string" />
    <xs:complexType>
        <xs:choice>
            <xs:element name="group" type="xs:string" minoccurs="1" maxoccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
</xs:element>

另一种方法是:

<xs:element name="user">
    <xs:attributename="name" type="xs:string" />
    <xs:simpleType name="SKU">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:element>

这允许您验证XML输入,并确保您的用户节点必须使用name属性,并且它可以有1..

如果您确实需要处理这样的XML -获取"User_Security"节点的子节点并获取节点名称:

  • XmlNode。子节点的时候存在缺陷
  • XmlNode。

来自MSDN文章的示例(根据您的XML调整,如果"User_Security"不是顶级元素,可能需要选择不同的根):

XmlDocument doc = new XmlDocument();
doc.LoadXml("<book ISBN='1-861001-57-5'>" +
            "<title>Pride And Prejudice</title>" +
            "<price>19.95</price>" +
            "</book>");
XmlNode root = doc.FirstChild;
//Display the contents of the child nodes. 
if (root.HasChildNodes)
{
  for (int i=0; i<root.ChildNodes.Count; i++)
  {
    Console.WriteLine(root.ChildNodes[i].InnerText);
  }
}

按照第二张海报所描述的重构XML会更有用。

有了这个结构,您可以很容易地做这样的事情(noroot是User_Security节点):
foreach (XmlNode nodUser in nodRoot.ChildNodes)
{
   string userName = nodUser.Attributes["Name"].Value;
   foreach (XmlNode nodGroup in nodUser)
   {
      string groupName = nodGroup.InnerText;
      // do something with userName and groupName here
   }
}

这将解析出您想要的内容…

        string xml = "<User_Security><bob><group>s1, a2, b3</group></bob><alice><group>y3, c2</group></alice></User_Security>";
        var e = XElement.Load(new XmlTextReader(xml, XmlNodeType.Element, null));
       var users = e.Elements()
        .Select(x => 
            new {
                Name = x.Name, 
                Groups = x.Element("group").Value.Split(new[] { ',' })
                         .Select(s => s.Trim())
                         .ToList() 
            }).ToList();

users.ForEach(u =>
    {
        Console.WriteLine(u.Name);
        u.Groups.ForEach(g => Console.WriteLine(" - " + g));
    });