0

我是ac#学习者,现在我一直面临这种情况:

这是我正在处理的 xml 示例

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

如您所见,它使用人员作为标签名称而不是标签数据,所以我不能使用 XmlDocument 的 getElementByTagName()

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

4

4 回答 4

2

编辑:我知道这并不能回答如何解决当前 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 输入并确保您的用户节点必须使用名称属性,并且它可以有 1..many 必须是字符串的组。

于 2013-05-21T21:24:40.517 回答
0

这将解析出你想要的......

        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));
    });
于 2013-05-21T21:53:21.777 回答
0

如果你真的必须处理这样的 XML - 获取“User_Security”节点的子节点并获取节点名称:

来自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);
  }
}
于 2013-05-21T21:33:54.650 回答
0

如第二张海报所述,重组您的 XML 会更有用。

使用该结构,您可以轻松地执行以下操作(nodRoot 是 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
   }
}
于 2013-05-21T21:43:01.113 回答