C# 使用XElement值时,是否可以获取父节点的非连接文本?
假设你有一个像这样的元素C# 使用XElement值时,是否可以获取父节点的非连接文本?,c#,.net,xml,C#,.net,Xml,假设你有一个像这样的元素 <name> TESTING <given>GIVENNAME2</given> <family>FAMILYNAME</family> </name> var descend = elements.ElementAt(i).DescendantsAndSelf(); foreach (XElement x in desc
<name>
TESTING
<given>GIVENNAME2</given>
<family>FAMILYNAME</family>
</name>
var descend = elements.ElementAt(i).DescendantsAndSelf();
foreach (XElement x in descend)
{
string g = x.Value;
}
当我尝试获取单个元素的值时,它适用于子节点,如给定和族,但当我尝试获取父元素中包含的文本时,该值返回该文本,加上所有子节点的连接文本。有人知道如何从父节点获取作为离散值的文本“TESTING”吗?并忽略子节点的文本
我不仅需要读取,还需要更改值,这就是我需要将其作为离散值的原因。您可以使用
节点
方法,查找具有节点类型
的节点类型
的XmlNodeType.Text
var elements = XElement.Parse(@"<name>
TESTING
<given>GIVENNAME2</given>
<family>FAMILYNAME</family>
</name>");
// grab just the first text node for your specific case
// (since we know the structure of this example)
var text = elements.Nodes().OfType<XText>().First();
Console.WriteLine("Before: " + text.Value);
text.Value = "Hello, World!";
Console.WriteLine("After: " + text.Value);
// general approach to inspect all nodes
foreach (var node in elements.Nodes())
{
switch (node.NodeType)
{
case XmlNodeType.Text:
var xtext = (XText)node; // could just ToString() it
Console.WriteLine("{0} : {1}", node.NodeType, xtext.Value);
break;
case XmlNodeType.Element:
var xelement = (XElement)node;
Console.WriteLine("{0} : {1} : {2}", node.NodeType,
xelement.Name, xelement.Value);
break;
default:
Console.WriteLine(node);
break;
}
}
var elements=XElement.Parse(@)
测试
吉文那美2
家庭名称
");
//抓取特定案例的第一个文本节点
//(因为我们知道这个例子的结构)
var text=elements.Nodes().OfType().First();
Console.WriteLine(“Before:+text.Value”);
text.Value=“你好,世界!”;
Console.WriteLine(“在:+text.Value之后”);
//检查所有节点的一般方法
foreach(elements.Nodes()中的var节点)
{
开关(node.NodeType)
{
案例XmlNodeType.Text:
var xtext=(xtext)node;//只需将其字符串()即可
WriteLine(“{0}:{1}”,node.NodeType,xtext.Value);
打破
case XmlNodeType.Element:
var-xelement=(xelement)节点;
Console.WriteLine(“{0}:{1}:{2}”),node.NodeType,
xelement.Name,xelement.Value);
打破
违约:
控制台写入线(节点);
打破
}
}
//
///此方法用于获取指定元素的单个内部值。
///
///包含用于检索值的XElement。
///仅返回指定元素的内部值。
///
///Value返回所有子元素值的连接字符串。如果
///只需要指定元素的内部文本值。
///
公共静态字符串InnerValue(此XElement元素)
{
//获取NodeType=Text的最后一个子节点。。。
var textNode=element.Nodes().OfType().LastOrDefault();
//如果找到,则返回文本节点的值
返回textNode!=null?textNode。值:string.Empty;
}
Text只是另一个子节点-处理它的方式与处理示例中给定的其他子节点相同。谢谢,它起了作用,但有一个副作用。当我更改文本的值并将XDocument写回字符串时,节点之间的格式(换行符或缩进)将被删除,即使我指定了XmlWriter设置Ident=true。仅就我修改的文档区域而言,其余部分看起来还可以。更干净和可重用的方法是创建一个扩展方法。上面的方法将只返回找到的最后一个文本节点。如果您有XText1 XText2,它将只返回XText2的值。另一种方法是将找到的所有XText节点的值连接起来。这对我们来说并不重要,因为我们在XSD中规定所有子元素必须位于文本节点之前。
var elements = XElement.Parse(@"<name>
TESTING
<given>GIVENNAME2</given>
<family>FAMILYNAME</family>
</name>");
// grab just the first text node for your specific case
// (since we know the structure of this example)
var text = elements.Nodes().OfType<XText>().First();
Console.WriteLine("Before: " + text.Value);
text.Value = "Hello, World!";
Console.WriteLine("After: " + text.Value);
// general approach to inspect all nodes
foreach (var node in elements.Nodes())
{
switch (node.NodeType)
{
case XmlNodeType.Text:
var xtext = (XText)node; // could just ToString() it
Console.WriteLine("{0} : {1}", node.NodeType, xtext.Value);
break;
case XmlNodeType.Element:
var xelement = (XElement)node;
Console.WriteLine("{0} : {1} : {2}", node.NodeType,
xelement.Name, xelement.Value);
break;
default:
Console.WriteLine(node);
break;
}
}
/// <summary>
/// This method is used to get the individual inner value of the specified element.
/// </summary>
/// <param name="element">Contains the XElement to retrieve a value.</param>
/// <returns>Returns only the inner value of the element specified.</returns>
/// <remarks>
/// XElement.Value returns a concatenated string of all child element values. This is bad if
/// only the inner text value of the specified element is required.
/// </remarks>
public static string InnerValue(this XElement element)
{
// get the last child node of NodeType = Text...
var textNode = element.Nodes().OfType<XText>().LastOrDefault();
// return the value of the text node if found
return textNode != null ? textNode.Value : string.Empty;
}