在C中解析XML#

问题描述:

我仍在为一个项目工作,我非常享受它。在C中解析XML#

我想看看我是否能使用XML

在此刻实现实时更新进我甚至不知道如何分析这种特殊类型的XML作为所有我发现是解析节点值等教程

,但我想沿着这

<Object name="ObjectName" type="ObjectType" size="ObjectSize" image="ObjectImage" /> 

线的东西,如果你们能帮助我了解如何从该节点,这将是惊人的访问的内部元素,如果不是太多问一个小小的e xplanation让我明白。我知道如何解析XML,看起来像这样使用的XElement

<Object> 
    <Name>ObjectName</Name> 
    <Type>ObjectType</Type> 
    <Size>ObjectSize</Size> 
    <Image>ObjectImage</Image> 
</Object> 

我只是不能似乎在顶部解析的例子,我不介意它的LINQ的,只要它是在C#中,也许会告诉我你为什么会选择一个吗?还有你有任何想法如何检查文件是否已经改变,所以我可以实施实时更新?

感谢您的帮助

约翰

+0

在.NET中xml(de)序列化程序有什么问题?请参阅http://support.microsoft.com/kb/815813。你绑定到这个XML模式?如果是,请忘记此评论。 – boj

在上面的示例使用属性的而不是子元素但它一起工作一样容易:

XElement element = XElement.Parse(xml); 
string name = (string) element.Attribute("name"); 
string type = (string) element.Attribute("type"); 
string size = (string) element.Attribute("size"); 
string image = (string) element.Attribute("image"); 

我通常更喜欢使用explicit string conversion而不是Value property,就好像您在null参考上执行转换一样,您只需以null字符串引用而不是NullReferenceException结束。当然,如果这是一个编程错误缺少一个属性,那么异常是更合适的,并且Value属性是好的。 (同样的逻辑适用于转换XElement值以及,顺便。)

+0

这是使用演员和我从未考虑过的'Value'属性之间的一个有用区别。谢谢你的提示。 – mquander

+0

非常感谢您的快速回复。 –

使用还可以使用XEelment.FirstAttribute来获得元件上的第一属性,然后XAttribute.NextAttribute遍历它们。这并不依赖于您知道该属性存在。

XAttribute attribute = element.FirstAttribute; 
while (attribute != null) 
{ 
    // Do stuff 
    attribute = attribute.NextAttribute` 
} 
+0

为什么要循环而不是要求你想要的? –

+0

@Jon - 我想这取决于你想做什么。你的方式更明确。也只是提供一个替代品。 – ChrisF

+0

非常感谢您的快速回复。 –

如果你有一个代表你的文档的域对象(通常是这种情况),那么XmlSerializer是很容易使用的。

[XmlRoot("Object") 
public class Item 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public string Size { get; set; } 
    public string Image { get; set; } 
} 

用法:

XmlSerializer ser = new XmlSerializer(typeof(Item)); 
Item item = (Item)ser.Deserialize(someXmlStream); 

当整个文件是某种类型的域对象我发现使用这种方法比手工解析更容易。