-2

我有一些 XML 代码,但无法获取name属性的值。

我得到所有其他元素值和属性值。

你们能帮帮我吗?我正在使用 Visual Studio 2019。

<?xml version="1.0" encoding="UTF-8"?>
<jp06:project-areas xmlns:jp06="http://jazz.net/xmlns/prod/jazz/process/0.6/">       
  <jp06:project-area jp06:name="dsafasfasdasdasdas">
    <jp06:summary>wewerwer</jp06:summary>   
  </jp06:project-area>
</jp06:project-areas>

我想要name来自的属性值project-area。我尝试了多种方法,但没有成功。project-areas是一个列表project-area

4

1 回答 1

0

这里有几种不同的方法可以做到这一点。

使用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;
于 2019-08-01T18:07:02.367 回答