我有这段代码:
public class Hero
{
XmlReader Reader = new XmlTextReader("InformationRepositories/HeroRepository/HeroInformation.xml");
XmlReaderSettings XMLSettings = new XmlReaderSettings();
public ImageSource GetHeroIcon(string Name)
{
XMLSettings.IgnoreWhitespace = true;
XMLSettings.IgnoreComments = true;
Reader.MoveToAttribute(" //I'm pretty much stuck here.
}
}
这是我想要阅读的XML文件:
<?xml version="1.0" encoding="utf-8" ?>
<Hero>
<Legion>
<Andromeda>
<HeroType>Agility</HeroType>
<Damage>39-53</Damage>
<Armor>3.1</Armor>
<MoveSpeed>295</MoveSpeed>
<AttackType>Ranged(400)</AttackType>
<AttackRate>.75</AttackRate>
<Strength>16</Strength>
<Agility>27</Agility>
<Intelligence>15</Intelligence>
<Icon>Images/Hero/Andromeda.gif</Icon>
</Andromeda>
</Legion>
<Hellbourne>
</Hellbourne>
</Hero>
我想要获得,/ Icon&gt;元件。
答案 0 :(得分:2)
MoveToAttribute()对您没有帮助,因为XML中的所有内容都是元素。 Icon元素是Andromeda元素的子元素。
如果您使用3.5 xml之前的处理,最简单的导航XML文档的方法之一是使用XPathNavigator。 See this example for getting started,但基本上您只需要创建它并致电MoveToChild()
或MoveToFollowing()
,它就会让您到达您希望在文档中的位置。
XmlDocument doc = new XmlDocument();
doc.Load("InformationRepositories/HeroRepository/HeroInformation.xml");
XPathNavigator nav = doc.CreateNavigator();
if (nav.MoveToFollowing("Icon",""))
Response.Write(nav.ValueAsInt);
请注意,XPathNavigator
是一种仅向前的机制,因此如果您需要循环或搜索文档,则可能会出现问题。
如果您只是阅读XML以将值放入对象中,则应认真考虑通过object serialization to XML自动执行此操作。这将为您提供一种无痛且自动的方式将xml文件加载回对象。
答案 1 :(得分:0)
根据要加载的元素在对象中标记属性: 请参阅:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeattribute.aspx
如果出于某种原因,您无法对当前对象执行此操作,请考虑创建一个镜像原始对象的桥对象,并添加一个返回原始对象的AsOriginal()方法。
解决msdn示例:
public class GroupBridge
{
[XmlAttribute (Namespace = "http://www.cpandl.com")]
public string GroupName;
[XmlAttribute(DataType = "base64Binary")]
public Byte [] GroupNumber;
[XmlAttribute(DataType = "date", AttributeName = "CreationDate")]
public DateTime Today;
public Group AsOriginal()
{
Group g = new Group();
g.GroupName = this.GroupName;
g.GroupNumber = this.GroupNumber;
g.Today = this.Today;
return g;
}
}
public class Group
{
public string GroupName;
public Byte [] GroupNumber;
public DateTime Today;
}
要从LINQ对象进行Serialize和DeSerialize,您可以使用:
public static string SerializeLINQtoXML<T>(T linqObject)
{
// see http://msdn.microsoft.com/en-us/library/bb546184.aspx
DataContractSerializer dcs = new DataContractSerializer(linqObject.GetType());
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
dcs.WriteObject(writer, linqObject);
writer.Close();
return sb.ToString();
}
public static T DeserializeLINQfromXML<T>(string input)
{
DataContractSerializer dcs = new DataContractSerializer(typeof(T));
TextReader treader = new StringReader(input);
XmlReader reader = XmlReader.Create(treader);
T linqObject = (T)dcs.ReadObject(reader, true);
reader.Close();
return linqObject;
}
我没有任何来自非LINQ对象的序列化示例代码,但MSDN链接应指向正确的方向。
答案 2 :(得分:0)
您可以使用linq to xml:
public class XmlTest
{
private XDocument _doc;
public XmlTest(string xml)
{
_doc = XDocument.Load(new StringReader(xml);
}
public string Icon { get { return GetValue("Icon"); } }
private string GetValue(string elementName)
{
return _doc.Descendants(elementName).FirstOrDefault().Value;
}
}
答案 3 :(得分:-1)
您可以使用此正则表达式“<Icon>.*</Icon>
”来查找所有图标
然后删除删除标签,并使用它....
将是很多更短
Regex rgx = new Regex("<Icon>.*</Icon>");
MatchCollection matches = rgx.Matches(xml);
foreach (Match match in matches)
{
string s= match.Value;
s= s.Remove(0,6)
s= s.Remove(s.LastIndexOf("</Icon>"),7);
console.Writeline(s);
}