【问题标题】:Accessing inner text from XML in C#在 C# 中从 XML 访问内部文本
【发布时间】:2013-09-12 06:39:11
【问题描述】:
<?xml version="1.0" encoding="utf-8"?>
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:TestCRForm:-myXSD-2013-01-09T15-23-27" solutionVersion="1.0.0.285" productVersion="14.0.0.0" PIVersion="1.0.0.0" href="http://win-rskupn6mf2b:2331/TestCRForm/Forms/template.xsn"?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" xmlns:ma="http://schemas.microsoft.com/office/2009/metadata/properties/metaAttributes" xmlns:d="http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields" xmlns:q="http://schemas.microsoft.com/office/infopath/2009/WSSList/queryFields" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:dms="http://schemas.microsoft.com/office/2009/documentManagement/types" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:tns="http://microsoft.com/webservices/SharePointPortalServer/UserProfileService" xmlns:s1="http://microsoft.com/wsdl/types/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-01-09T15:23:27" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-US">
    <my:VendorName>Vendor Name1</my:VendorName>
    <my:Assignedto>Asigner</my:Assignedto>
    <my:SOWNumber></my:SOWNumber>
    <my:DraftStarted xsi:nil="true"></my:DraftStarted>
    <my:DateComplete xsi:nil="true"></my:DateComplete>
    <my:GLCode>Material No1</my:GLCode>
    <my:LogID>2013-09-05T22:44:09</my:LogID>
    <my:Status>New</my:Status>
    <my:ProjectDescription>
    <html xmlns="http://www.w3.org/1999/xhtml" xml:space="preserve">
      <p>​ THIS TEXT</p>
    </html>
  </my:ProjectDescription>

</my:myFields>

我可以访问标签内的字段:VendorName & AssignedTo 使用以下

XmlNodeList nodelist1 = xml.GetElementsByTagName("my:myFields");
foreach (XmlNode node in nodelist1)
            text_name = node["my:VendorName"].InnerText;

但我无法访问 ProjectDescription 标记内的内部文本,即使用“THIS TEXT”

XmlNodeList nodelist1 = xml.GetElementsByTagName("my:myFields/my:ProjectDescription/html");
foreach (XmlNode node in nodelist1)
                text1 = node["p"].InnerText;

在调试模式下运行时,我在 nodelist1 中得到 NULL。

请给我建议一种方法来做到这一点。

【问题讨论】:

  • 我认为 my:myFields/my:ProjectDescription/html 的语法不正确。尝试单独获取它。看看这个:bytes.com/topic/net/answers/…
  • 我已经尝试过另一个没有命名空间的简单 xml 文件,它工作正常。与名称空间有关,但我无法准确弄清楚。

标签: c# xml sharepoint-2010 infopath2010


【解决方案1】:
XmlNamespaceManager nsm = new XmlNamespaceManager(xml.NameTable);
nsm.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-01-09T15:23:27");
nsm.AddNamespace("x", "http://www.w3.org/1999/xhtml");

XmlNodeList nodelist1 = xml.SelectNodes("my:myFields/my:ProjectDescription/x:html",nsm);
foreach (XmlNode node in nodelist1)
    Console.WriteLine(node["p"].InnerText);

【讨论】:

    【解决方案2】:

    这行得通:

    XmlNodeList nodelist1 = xml.SelectNodes("my:myFields/my:ProjectDescription");
                foreach (XmlNode node in nodelist1)
                {
                    text1 = node["html"].InnerText;
                }
    

    即使在字符串 text1 中,它也会将 tag.innerText 转换为段落格式。你可以从那里修剪它。

    【讨论】:

    • 这是我的完整测试代码。 XmlDocument 文档 = 新 XmlDocument(); doc.Load("text.xml");字符串文本1; XmlNodeList nodelist1 = doc.SelectNodes("myFields/ProjectDescription"); foreach(nodelist1 中的 XmlNode 节点){ text1 = node["html"].InnerText; Console.WriteLine(text1); }
    • 它抛出异常。尝试使用有问题的 xml。你需要XmlNamespaceManager,就像我的回答一样。您使用myFields/ProjectDescription 进行测试,但在答案中添加my:
    【解决方案3】:

    我使用System.Xml.Linq.XDocumentXPath 创建了一个解决方案。我认为您可以最好地使用 XPath。它解释了我认为的命名空间问题。

    XPath:

    using System.Xml.XPath;
    
    var document = System.Xml.Linq.XDocument.Load(@"D:\test.xml");
    var namespaceManager = new System.Xml.XmlNamespaceManager(new System.Xml.NameTable());
    namespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-01-09T15:23:27");
    namespaceManager.AddNamespace("html", "http://www.w3.org/1999/xhtml");
    var pValue = document.XPathSelectElement("/my:myFields/my:ProjectDescription/html:html/html:p", namespaceManager).Value;
    

    XDocument:

    var xml = System.Xml.Linq.XDocument.Load(@"D:\test.xml");
    
    var myNamespace = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-01-09T15:23:27";
    var htmlNamespace = "http://www.w3.org/1999/xhtml";
    
    var myFields = xml.Element(System.Xml.Linq.XName.Get("myFields", myNamespace));
    var projectDescription = myFields.Element(System.Xml.Linq.XName.Get("ProjectDescription", myNamespace));
    var htmlTag = projectDescription.Element(System.Xml.Linq.XName.Get("html", htmlNamespace));
    var pTag = htmlTag.Element(System.Xml.Linq.XName.Get("p", htmlNamespace));
    
    var pValue = pTag.Value;
    

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 2013-11-02
      • 2013-10-15
      • 2012-12-30
      • 2016-05-16
      • 1970-01-01
      • 2012-01-21
      • 2013-10-25
      • 2016-01-10
      相关资源
      最近更新 更多