body
在下面的代码中获取混合元素内容的最佳方法是什么?该元素可能包含XHTML或文本,但我只想要其字符串形式的内容.该XmlElement
类型具有InnerXml
我正在追求的属性.
编写的代码几乎可以实现我想要的功能,但包含了我不想要的周围的<body>
... </body>
元素.
XDocument doc = XDocument.Load(new StreamReader(s));
var templates = from t in doc.Descendants("template")
where t.Attribute("name").Value == templateName
select new
{
Subject = t.Element("subject").Value,
Body = t.Element("body").ToString()
};
Run Code Online (Sandbox Code Playgroud) 考虑以下XML:
<response>
<status_code>200</status_code>
<status_txt>OK</status_txt>
<data>
<url>http://bit.ly/b47LVi</url>
<hash>b47LVi</hash>
<global_hash>9EJa3m</global_hash>
<long_url>http://www.tumblr.com/docs/en/api#api_write</long_url>
<new_hash>0</new_hash>
</data>
</response>
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种非常简短的方法来获得<hash>
元素的价值.我试过了:
var hash = xml.Element("hash").Value;
Run Code Online (Sandbox Code Playgroud)
但那不起作用.是否可以提供XPath查询XElement
?我可以使用旧System.Xml
框架来执行此操作,执行以下操作:
xml.Node("/response/data/hash").Value
Run Code Online (Sandbox Code Playgroud)
在LINQ命名空间中是否有这样的东西?
更新:
在对此进行了一些讨论之后,我找到了一种方法来做我正在尝试做的事情:
var hash = xml.Descendants("hash").FirstOrDefault().Value;
Run Code Online (Sandbox Code Playgroud)
我仍然有兴趣看看是否有人有更好的解决方案?
我如何才能获得XElement的孩子?
我目前正在使用XElement.Descendants()函数,它返回所有级别的XElements,而不仅仅是子节点.
我真正想要的只是孩子们的IEnumerable.
我在文档中有一个XElement.给定XElement(和XDocument?),是否有一个扩展方法来获取其完整(即绝对,例如/root/item/element/child
)XPath?
例如myXElement.GetXPath()?
编辑:好的,看起来我忽略了一些非常重要的事情.哎呦!需要考虑元素的索引.请参阅我对修正后的解决方案的最后答案.
所以让我们假设这是我想要实现的:
<root>
<name>AAAA</name>
<last>BBBB</last>
<children>
<child>
<name>XXX</name>
<last>TTT</last>
</child>
<child>
<name>OOO</name>
<last>PPP</last>
</child>
</children>
</root>
Run Code Online (Sandbox Code Playgroud)
不确定使用XElement是否是最简单的方法,
但这是我到目前为止所做的:
XElement x = new XElement("root",
new XElement("name", "AAA"),
new XElement("last", "BBB"));
Run Code Online (Sandbox Code Playgroud)
现在我必须根据我的一些数据添加"孩子".
可能有1,2,3,4 ......
所以我需要通过我的列表进行迭代以获得每个孩子
foreach (Children c in family)
{
x.Add(new XElement("child",
new XElement("name", "XXX"),
new XElement("last", "TTT"));
}
Run Code Online (Sandbox Code Playgroud)
这样我就会错过"CHILDREN Parent节点".如果我只是在foreach之前添加它,它将被渲染为一个封闭的节点
<children/>
Run Code Online (Sandbox Code Playgroud)
这不是我们想要的.
如何将第一部分添加到父节点并添加到我的列表中?
我有一个像这样的字符串: "<Root><Child>Hey</Child></Root>"
如何将其转换为XElement
对象?
我有一个看起来像这样的XElement:
<User ID="11" Name="Juan Diaz" LoginName="DN1\jdiaz" xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/" />
Run Code Online (Sandbox Code Playgroud)
如何使用XML提取LoginName属性的值?我尝试了以下,但q2"枚举没有产生任何结果".
var q2 = from node in el.Descendants("User")
let loginName = node.Attribute(ns + "LoginName")
select new { LoginName = (loginName != null) };
foreach (var node in q2)
{
Console.WriteLine("LoginName={0}", node.LoginName);
}
Run Code Online (Sandbox Code Playgroud) 示例xml:
<parent>
<child>test1</child>
<child>test2</child>
</parent>
Run Code Online (Sandbox Code Playgroud)
如果我查找parent.Value,其中parent是XElement,我得到"test1test2".我期待的是"".(因为没有文字/值.
我应该寻找XElement的哪些属性?
所以,我有一个要删除的bug
foreach (XElement x in items.Elements("x"))
{
XElement result = webservice.method(x);
if (/*condition based on values in result*/)
{
x.Remove();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是调用x.Remove()会改变foreach,如果有两个元素("x"),并且第一个被删除,则循环不会到达第二个x元素.
那我该如何循环呢?或者是否应该以另一种方式重写?
我知道没有直接的方法,但仍然..我们可以将XElement
元素转换为XmlNode
.类似的选项InnerText
,并InnerXml
有 XmlNode
具体的.
所以,如果我想使用这些选项,可以做什么来转换 XElement
成XmlNode
反之亦然.