使用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()如何解析名称和它们所属的组?
编辑:我知道这并没有回答如何解决当前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));
});