从xml元素中选择属性

本文关键字:选择 属性 元素 xml | 更新日期: 2023-09-27 18:12:41

我试图从我的根节点选择一个属性,但我一直在选择部分得到一个空异常。

获取属性值的正确方法是什么?

我试图获得属性值的值:SymbolicName

xml文档:

<Bundle xmlns="urn:uiosp-bundle-manifest-2.0" Name="ContactUsPlugin" SymbolicName="ContactUsPlugin" Version="1" InitializedState="Active">
  <Activator Type="ContactUsPlugin.Activator" Policy="Immediate" />
  <Runtime>
    <Assembly Path="bin'ContactUsPlugin.dll" Share="false" />
  </Runtime>
  <Functionality>
    <Controller>About</Controller>
    <View>Index</View>
  </Functionality>
  <Scripts>
    <Script version="1">
      <Location>E:'Git Projects'Kapsters'Plugins'ContactUsPlugin'Sql'Sql1.txt</Location>
    </Script>
    <Script version="2">
      <Location>E:'Git Projects'Kapsters'Plugins'ContactUsPlugin'Sql'Sql1.txt</Location>
    </Script>
  </Scripts>
</Bundle>

我试着:

  string widgetCodeName =
            (from db in ManifestDocument.Elements() select db.Attribute("SymbolicName").Value).First();
   string widgetCodeName =
            (from db in ManifestDocument.Descendants() select db.Element("Bundle").Attribute("SymbolicName").Value).First();
  string widgetCodeName =
            (from db in ManifestDocument.Element("Bundle").Attributes() where db.Name == "SymbolicName" select db.Value).First();

从xml元素中选择属性

根据您拥有的xml, bundle标记是根节点。试一试:

string widgetCodeName = ManifestDocument.Root.Attribute("SymbolicName").Value;

所有这些例子都取决于您是只需要值还是只需要XAttribute本身:

XDocument ManifestDocument = XDocument.Load("YourXmlFile.xml");
var myquery = ManifestDocument.Elements().Attributes("SymbolicName").First();//the XAttribute
string myvalue = ManifestDocument.Root.Attribute("SymbolicName").Value;//the value itself
var secondquery = ManifestDocument.Descendants().Attributes("SymbolicName").First();//another way to get the XAttribute

最后一个(第二个查询)将获得SymbolicName属性,即使也在另一个节点中定义,如果您删除。first()。

如果这是您的整个XML,那么您可以使用下面的代码获得它。

XElement elem = XElement.Parse(xmlStr);
string val = elem.Attribute("SymbolicName").Value;

其中xmlStr是您的XML。如果属性缺失,那么attribute方法将返回null,所以在访问Value属性

之前,请确保测试是否为null。

您的Bundle元素有一个xml名称空间。您需要指定它:

XNamespace ns = "urn:uiosp-bundle-manifest-2.0";
string widgetCodeName = (string)ManifestDocument
                          .Element(ns + "Bundle")
                          .Attribute("SymbolicName");

或者,如果Bundle是您的Root元素,您可以:

string widgetCodeName = (string)ManifestDocument
                          .Root
                          .Attribute("SymbolicName");

试试这个:

XNamespace ns = "urn:uiosp-bundle-manifest-2.0";
XDocument xd = XDocument.Load(@"xmlDocument");

var assemblyLocation = from a in xd.Descendants(ns + "Bundle")
                               select new
                               {
                                   Path = a.Element(ns + "Runtime").Element(ns + "Assembly").Attribute("Path").Value,
                               };