【问题标题】:How to get name value? [closed]如何获取名称值? [关闭]
【发布时间】:2019-08-01 17:04:36
【问题描述】:

我有一些 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>

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

【问题讨论】:

  • @IvMisticos:有 XML,但没有缩进,所以它被作为 HTML 吞并了。我已经重新格式化了。但我同意,我们需要 OP 一直在尝试的代码。
  • 看到这个stackoverflow question,它可能对你有帮助。告诉我是否有。
  • 这可能会有所帮助(完全披露......这是我的答案):stackoverflow.com/questions/27003701/parse-this-xml-to-object/…。将数据解析为 C# 对象后,您可以通过“myObject.projectarea.name”访问“名称”字段
  • Mike 问题在于解析为 c# 对象。我无法获得的唯一字段是名称。当其他字段不为空时,始终显示为 null

标签: c# xml


【解决方案1】:

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

使用 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 =&gt; Paste Special =&gt; 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;

【讨论】:

  • 但我认为序列化函数无法从插入到 xml 列表中的元素中获取属性。我可以获得项目区域内的其他元素,但每个项目区域的属性始终显示为空。不要忘记项目区域是一个包含多个项目区域的列表,我想要每个项目区域的所有名称,而不仅仅是第一个
  • @atno “但我认为序列化函数无法从插入到 xml 列表中的元素中获取属性”——这是错误的。上面的XmlSerializer 示例适用于您的示例 XML,您真的尝试过吗?
  • 您说的那条注释(“注意属性 Form = XmlSchemaForm.Qualified 在 name 属性属性上很重要”)是缺少的部分。谢谢你的朋友
  • steve 仅适用于单个元素,而不适用于多个元素。当项目区域有多个元素时,名称为空。这种形式就是方式。
  • 不确定您的意思,尝试了多个project-area 元素,效果很好。你能澄清问题是什么,也许用你的代码不工作来更新你的问题。
猜你喜欢
  • 2013-07-25
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
相关资源
最近更新 更多