首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从xml/scxml获取属性

如何从xml/scxml获取属性
EN

Stack Overflow用户
提问于 2013-11-09 17:38:23
回答 1查看 468关注 0票数 1

我正在尝试使用LINQ表达式从scxml文件中的"state“和"transition”获取属性。

以下是scxml文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<scxml xmlns:musthave="http://musthave.com/scxml/1.0" version="1.0" initial="Start" xmlns="http://www.w3.org/2005/07/scxml">
    <state id="abc" musthave:displaystate="abcd" musthave:attribute1="None" musthave:attribute2="None">
        <transition attribute3="blabla" attribute4="blabla" xmlns=""/>
    </state>
    <state id="bla" musthave:displaystate="ababab" musthave:attribute2="View" musthave:attribute1="View"/>
</scxml> 

我正在做的事情是:

代码语言:javascript
复制
var scxml = XDocument.Load(@"c:\test_scmxl.scxml");

如果我在控制台上打印,它会向我显示:

代码语言:javascript
复制
<scxml xmlns:musthave="http://musthave.com/scxml/1.0" version="1.0" initial="Start" xmlns="http://www.w3.org/2005/07/scxml">
    <state id="abc" musthave:displaystate="abcd" musthave:attribute1="None" musthave:attribute2="None">
        <transition attribute3="blabla" attribute4="blabla" xmlns=""/>
    </state>
    <state id="bla" musthave:displaystate="ababab" musthave:attribute2="View" musthave:attribute1="View"/>
</scxml> 

我想让所有的“州”都像这样:

代码语言:javascript
复制
foreach (var s in scxml.Descendants("state"))
{
     Console.WriteLine(s.FirstAttribute);
}

当我打印它看我是否得到id="abc",在这个例子中,它不返回任何东西。

不过,如果我运行代码:

代码语言:javascript
复制
foreach (var xNode in scxml.Elements().Select(element => (from test in element.Nodes() select test)).SelectMany(a => a))
{
     Console.WriteLine(xNode);
     Console.WriteLine("\n\n\n");
}

它向我展示:

代码语言:javascript
复制
<state id="abc" musthave:displaystate="abcd" musthave:attribute1="None" musthave:attribute2="None" xmlns:musthave="http://musthave.com/scxml/1.0" xmlns="http://www.w3.org/2005/07/scxml">
  <transition attribute3="blabla" attribute4="blabla" xmlns="" />
</state>



<state id="bla" musthave:displaystate="" musthave:attribute2="View" musthave:attribute1="View" xmlns:musthave="http://musthave.com/scxml/1.0"
xmlns="http://www.w3.org/2005/07/scxml" />

知道怎么做吗?

注意:,我已经读过很多文章,并试图按照建议去做,但是直到现在,似乎什么也没有起作用。

编辑:它没有任何属性,就像“第一个属性”一样。

代码语言:javascript
复制
foreach (var state in scxml.Descendants("state"))
{
    Console.WriteLine(state.Attribute("id"));
}

编辑:下面的代码也不起作用。Console警告空的可能性(可抑制的)。什么都不回。

代码语言:javascript
复制
foreach (var state in scxml.Root.Descendants("state"))
{
    Console.WriteLine(state.Attribute("id"));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-11 03:13:00

scxml标记中有一个名称空间,因此您需要在内部标记中使用它来访问它们。下面是您需要的代码:

代码语言:javascript
复制
XDocument xdoc = XDocument.Load(path_to_xml);
XNamespace ns = "http://www.w3.org/2005/07/scxml";
foreach (var state in xdoc.Descendants(ns + "state"))
{
    Console.WriteLine(state.Attribute("id").Value);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19879965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档