这里有几种不同的方法可以做到这一点。
使用XDocument和使用 XPath 查询扩展:
// load our xml into an XDocument
XDocument xDoc = XDocument.Load(stream);
// register the namespace with a prefix so we can use it in xpath
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("jp06", "http://jazz.net/xmlns/prod/jazz/process/0.6/");
var name = (string)xDoc.Root.XPathEvaluate(@"string(//jp06:project-area/@jp06:name)", namespaceManager);
使用XDocument和 Linq to XML:
XDocument xDoc = XDocument.Load(stream);
XNamespace jp06 = XNamespace.Get("http://jazz.net/xmlns/prod/jazz/process/0.6/");
var name = xDoc.Root
.Descendants(jp06 + "project-area")
.Attributes(jp06 + "name")
.Single().Value;
使用XMLSerializer. 请注意,该属性Form = XmlSchemaForm.Qualified在 name 属性属性上很重要。如果对所需的结构有疑问,请在 Visual Studio 中将您的 XML 复制到剪贴板,转到Edit => Paste Special => Paste XML as classes. 自动生成的类并不漂亮,但您可以了解需要什么。
班级结构:
[XmlRoot("project-areas", Namespace = "http://jazz.net/xmlns/prod/jazz/process/0.6/")]
public class ProjectAreas
{
[XmlElement("project-area")]
public List<ProjectArea> Areas { get; set; }
}
[XmlRoot("project-area", Namespace = "http://jazz.net/xmlns/prod/jazz/process/0.6/")]
public class ProjectArea
{
[XmlAttribute("name", Form = System.Xml.Schema.XmlSchemaForm.Qualified)]
public string Name { get; set; }
[XmlElement("summary")]
public string Summary { get; set; }
}
用法:
XmlSerializer serializer = new XmlSerializer(typeof(ProjectAreas));
ProjectAreas projectAreas = (ProjectAreas)serializer.Deserialize(textReader);
var name = projectAreas.Areas.First().Name;