我试图从我的根节点中选择一个属性,但我一直在选择部分上得到一个空例外。
获取属性值的正确方法是什么?
我试图获取属性值的值: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();
答案 0 :(得分:2)
根据您拥有的xml,bundle标记是根节点。尝试:
string widgetCodeName = ManifestDocument.Root.Attribute("SymbolicName").Value;
答案 1 :(得分:1)
如果这是您的整个XML,那么您可以使用下面的代码获取它。
XElement elem = XElement.Parse(xmlStr);
string val = elem.Attribute("SymbolicName").Value;
其中xmlStr是您的XML。如果缺少该属性,那么Attribute方法将返回null,因此请确保在访问Value属性
之前测试null答案 2 :(得分:1)
所有这些示例都取决于您是否只需要值或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
如果删除了.First(),那么即使在另一个节点中也定义了最后一个(secondquery),它将获得SymbolicName属性。
答案 3 :(得分:0)
您的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");
答案 4 :(得分:0)
试试这个:
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,
};