Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XElement值时,是否可以获取父节点的非连接文本?_C#_.net_Xml - Fatal编程技术网

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;
    }