【问题标题】:xml select next node and change value of that nodexml 选择下一个节点并更改该节点的值
【发布时间】:2013-09-04 07:25:35
【问题描述】:

我创建了这个 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<Contacts xmlns:g="http://something.com">
  <Contact>
    <g:Phone>206-555-0144</g:Phone>
    <g:Name>Patrick Hines</g:Name>
    <g:Address>
      <street>this street</street>
    </g:Address>
  </Contact>
</Contacts>

我正在尝试选择电话节点,然后尝试获取下一个节点。电话节点是独一无二的,所以这就是我首先寻找它的原因。如何更改名称的值?

var doc = XDocument.Load("c:\\temp\\contacts.xml");
var reader = doc.CreateReader();
var namespaceManager = new XmlNamespaceManager(reader.NameTable);
namespaceManager.AddNamespace("g", g.NamespaceName);
var node = doc.XPathSelectElement("/Contacts/Contact/g:Phone[text()='206-555-0144']", namespaceManager);

var nd =node.NextNode // does not work

node.Value = "sjfjks";

【问题讨论】:

    标签: xml c#-4.0 linq-to-xml


    【解决方案1】:

    首先,您的代码根本无法编译。您在有问题的行末尾缺少;

    可能更重要的是,您将node.NextNode 分配给nd 变量(指向&lt;name&gt; 元素)但您更改node.Value 而不是nd!您绝对应该首先为您的变量分配更具描述性的名称!

    我可以使用以下方法:

    var phone = doc.XPathSelectElement("/Contacts/Contact/g:Phone[text()='206-555-0144']", namespaceManager);
    
    // you have to cast NextNode to XElement to allow changing it's value
    var name = (XElement)phone.NextNode;
    
    // change name.Value instead of phone.Value!
    name.Value = "test";
    

    打印出的 doc 值看起来像预期的那样:

    <Contacts xmlns:g="http://something.com">
      <Contact>
        <g:Phone>206-555-0144</g:Phone>
        <g:Name>test</g:Name>
        <g:Address>
          <street>this street</street>
        </g:Address>
      </Contact>
    </Contacts>
    

    【讨论】:

      【解决方案2】:

      尝试先添加根节点,如果仍然不行,选择没有完整路径的电话节点:

      var doc = XDocument.Load("c:\\temp\\contacts.xml");
      var reader = doc.CreateReader();
      var namespaceManager = new XmlNamespaceManager(reader.NameTable);
      namespaceManager.AddNamespace("g", g.NamespaceName);
      
      var root = doc.Root; // set the Root of your document.
      
      var node = root.XPathSelectElement("/Contacts/Contact/g:Phone[text()='206-555-0144']", namespaceManager); 
      // if still doen't work try with 
      // root.XPathSelectElement("//g:Phone[text()='206-555-0144']", namespaceManager);
      
      var nd =node.NextNode;
      
      node.Value = "sjfjks";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多