C#按属性名称

时间:2016-08-27 14:37:39

标签: c# xml linq linq-to-xml xml-namespaces

我正在尝试在下面的xml代码中获取operating-system属性的值,但是在我从堆栈,dotnetcurry和Microsoft尝试的所有解决方案中,我得到了{{1或者它只返回没有值。

以下是我要解析的xml数据:

NullPointerExecption

我尝试了很多方法,但这是最后两个方法:

<Report name="Black Workstation" xmlns:cm="http://www.nessus.org/cm">
  <ReportHost name="192.168.1.000>
    <HostProperties>
        <tag name="HOST_END">Wed Jun 29 10:32:54 2016</tag>
        <tag name="LastAuthenticatedResults">1467214374</tag>
        <tag name="patch-summary-total-cves">5</tag>
        <tag name="cpe">cpe:/o:microsoft:windows</tag>
        <tag name="operating-system">Microsoft Windows 7 Enterprise Service Pack 1</tag>
    </HostProperties>
  </ReportHost>
</Report>

也试过这个解决方案:Use Linq to Xml with Xml namespaces

我在Microsoft教程中使用此方法,但它只返回true / false,我无法对其进行操作,因此它将值XNamespace ns = "http://www.nessus.org/cm"; var operatingSystem = (findings.Where(a => a.Attribute("name").Value == "operating-system") .Select(a => a.Value)); var operatingSystem = findings.Descendants().Where(x => x.Attribute("name").Value == ns + "operating-system"); 赋给Microsoft Windows 7 Enterprise Service Pack 1变量。

os

我尝试过使用上述XElement xelement = XElement.Load(s); IEnumerable<XElement> findings = xelement.Elements(); var hostProperties = from hp in findings.Descendants("HostProperties") select new { os = (string)hp.Element("tag").Attribute("name").Value == "operating-system", }; 子句的各种其他Linq-to-Xml查询,但它们都返回whereNull

2 个答案:

答案 0 :(得分:3)

在您的情况下,您不需要应用命名空间:

var result = XDocument.Load("data.xml")
                      .Descendants("tag")
                      .Where(e => e.Attribute("name").Value == "operating-system")
                      .FirstOrDefault()?.Value;

 //result = Microsoft Windows 7 Enterprise Service Pack 1

进一步阅读它here你实际上可以看到,即使你在xml中定义一个命名空间,你的元素都不会使用它。您定义的命名空间(xmlns:cm)仅适用于带有cm:前缀的元素,而它们不属于它们。

如果我按以下方式更改您的xml(名称空间仅适用于xmlns而不是xmlns:cm),请参阅:

<Report name="Black Workstation" xmlns="http://www.nessus.org/cm"> 
  <ReportHost name="192.168.1.000">
  <HostProperties>
    <tag name="HOST_END">Wed Jun 29 10:32:54 2016</tag>
    <tag name="LastAuthenticatedResults">1467214374</tag>
    <tag name="patch-summary-total-cves">5</tag>
    <tag name="cpe">cpe:/o:microsoft:windows</tag>
    <tag name="operating-system">Microsoft Windows 7 Enterprise Service Pack 1</tag>
  </HostProperties>
</ReportHost>
</Report>

上面的代码将返回null,您必须编写如下:

XNamespace ns = "http://www.nessus.org/cm";
var result = XDocument.Load("data.xml")
                      .Descendants(ns + "tag")
                      .Where(e => e.Attribute("name").Value == "operating-system")
                      .FirstOrDefault()?.Value;

答案 1 :(得分:0)

请尝试以下

 XDocument document = XDocument.Load("content.xml");
 var name = document.XPathSelectElement("Report/ReportHost/HostProperties/tag[@name='operating-system']").Value;