XML 读取“名称”后的多个数据

问题描述 投票:0回答:2

这是 xml

<?xml version="1.0"?>
<CFaveDefn-v000 Description="Favourite definitions, Default group" Created="18-Apr-2024 14:49">
    <Defn>
        <Display m_display.contrast.bEnabled="true" m_display.contrast.nLow="-138" m_display.contrast.nHigh="-80" m_display.scale.bEnabled="true" m_display.scale.nLow="-151" m_display.scale.nHigh="-42" m_display.bEnabled="true" m_display.bSmallIcon="true" m_display.n64FreqLow="2801644" m_display.nBandwidth="63913" />
        <Radio m_radio.bEnabled="false" m_radio.n64FreqLow="2801644" m_radio.nBandwidth="63913" />
        <Flags m_flags.bDefault="false" />
        <Name m_name.strGroup="-- UNKNOWN" m_name.strFolder="MIL-STD 188-141 - ALE" m_name.strTitle="2.835,000 ALE LSB unk-tx TIS:K01 TO:K13 +110" />
        <RX m_rx.nActive="0" m_rx.anEnabled="1" m_rx.astrDemod_count="1" m_rx.astrDemod_value_0="&lt;CDSPDemodRX-v000>&lt;Audio m_audio.bASIO=&quot;false&quot; m_audio.bEnable=&quot;true&quot; m_audio.nLevel=&quot;100&quot; m_audio.nDevice=&quot;-1&quot; m_audio.nChannels=&quot;0&quot; m_audio.szDevice=&quot;Default&quot;/>&lt;Freq m_freq.n64RX=&quot;2835000&quot; m_freq.n64TX=&quot;10000000&quot; m_freq.n64RXOffset=&quot;0&quot;/>&lt;Mode m_mode.nMode=&quot;0&quot;/>&lt;Main m_main.nID=&quot;0&quot; m_main.bTX=&quot;false&quot; m_main.bLock_0=&quot;false&quot;/>&lt;Filter m_filter.nLow=&quot;100&quot; m_filter.nHigh=&quot;2700&quot; m_filter.nTaps=&quot;257&quot; m_filter.nWindowing=&quot;3&quot;/>&lt;AGC m_agc.nAGC=&quot;1&quot; m_agc.levels_0.nDecay=&quot;0&quot; m_agc.levels_0.nGain=&quot;40&quot; m_agc.levels_0.nHang=&quot;0&quot; m_agc.levels_0.nKnee=&quot;0&quot; m_agc.levels_0.nSlope=&quot;0&quot; m_agc.levels_1.nDecay=&quot;250&quot; m_agc.levels_1.nGain=&quot;0&quot; m_agc.levels_1.nHang=&quot;100&quot; m_agc.levels_1.nKnee=&quot;-130&quot; m_agc.levels_1.nSlope=&quot;6&quot; m_agc.levels_2.nDecay=&quot;500&quot; m_agc.levels_2.nGain=&quot;0&quot; m_agc.levels_2.nHang=&quot;250&quot; m_agc.levels_2.nKnee=&quot;-130&quot; m_agc.levels_2.nSlope=&quot;6&quot; m_agc.levels_3.nDecay=&quot;1000&quot; m_agc.levels_3.nGain=&quot;0&quot; m_agc.levels_3.nHang=&quot;500&quot; m_agc.levels_3.nKnee=&quot;-130&quot; m_agc.levels_3.nSlope=&quot;6&quot;/>&lt;CW m_cw.bEnable=&quot;false&quot; m_cw.nLevel=&quot;48&quot;/>&lt;NB m_nb.bEnable=&quot;false&quot; m_nb.nThreshold=&quot;50&quot; m_nb.nWidth=&quot;50&quot;/>&lt;NR m_nr.bEnable=&quot;false&quot; m_nr.nMethod=&quot;0&quot; m_nr.nLMSThreshold=&quot;50&quot; m_nr.nRRNoise1=&quot;5&quot; m_nr.nLMSWidth=&quot;50&quot; m_nr.nLMSLevel=&quot;10&quot; m_nr.nSpectralReduction_0=&quot;3&quot; m_nr.nSpectralThreshold_0=&quot;10&quot; m_nr.nSpectralRescale_0=&quot;2&quot; m_nr.cleanup.nBins=&quot;0&quot; m_nr.cleanup.nMultiply=&quot;0&quot; m_nr.cleanup.nSquelch=&quot;0&quot; m_nr.cleanup.nLevel=&quot;0&quot; m_nr.cleanup.nWidth=&quot;0&quot; m_nr.cleanup.bPCS=&quot;0&quot; m_nr.cleanup.bSquelch=&quot;0&quot;/>&lt;Notch m_notch.bEnable=&quot;false&quot; m_notch.nLevel=&quot;50&quot;/>&lt;Squelch m_squelch.fm.hWnd=&quot;69082&quot; m_squelch.fm.nMsg=&quot;50078&quot; m_squelch.fm.bAuto=&quot;false&quot; m_squelch.fm.bCTCSS=&quot;false&quot; m_squelch.fm.bEnable=&quot;false&quot; m_squelch.fm.nCTCSSTone=&quot;67000&quot; m_squelch.fm.nCTCSSLevel=&quot;5&quot; m_squelch.fm.nLevel=&quot;2&quot; m_squelch.vad.bEnable=&quot;false&quot; m_squelch.vad.nCache=&quot;25&quot; m_squelch.vad.nLevel=&quot;25&quot; m_squelch.vad.nHang=&quot;250&quot;/>&lt;/CDSPDemodRX-v000>" />
        <TX m_tx.strMod="" />
    </Defn>
</CFaveDefn-v000>

我有一个 xml 文档,其中包含名为“RX”的多个数据。 到目前为止,我只能读取“RX”中的第一个名称,即“m_rx.nActive”,其值为“0”。

我需要读取2个数据:

  • Freq m_freq.n64RX="2835000" '我需要 2835000 值
  • 模式 m_mode.nMode="0" '我需要“0"”中的“0”

你能帮我解决这个问题吗?

非常感谢 雷蒙德

Dim xmlToTxt As XmlReader = XmlReader.Create(文件名) '

    Do While xmlToTxt.Read()

        If xmlToTxt.NodeType = XmlNodeType.Element AndAlso xmlToTxt.Name = "RX" Then

            MsgBox(xmlToTxt.GetAttribute(0) & "   <>")  'm_rx.nActivate="0" i can read

        End If

    Loop
xml
2个回答
0
投票

尝试以下powershell脚本(可以转换为VBnet)

using assembly System.Xml.Linq
$filename = 'c:\temp\test.xml'

$doc = [System.Xml.Linq.XDocument]::Load($filename)
$defn = $doc.Descendants('Defn') | foreach({[System.Xml.Linq.XElement]$_})

$defs = @{}
foreach($def in $defn[0].Elements())
{
   foreach($attr in $def.Attributes())
   {
      if($attr.Value.StartsWith('<'))
      {
         $element = [System.Xml.Linq.Xelement]::Parse($attr.Value)
         foreach($ele in $element.Elements())
         {
            $defs[$ele.Name.LocalName] = $ele.Value
         }
      }
      else `
      {
         $defs[$attr.Name.LocalName] = $attr.Value
      }
   }
   
}
$defs

结果

Name                           Value
----                           -----
m_display.scale.bEnabled       true
NB
NR
Notch
m_rx.nActive                   0
m_name.strTitle                2.835,000 ALE LSB unk-tx TIS:K01 TO:K13 +110
Main
m_display.bEnabled             true
m_display.contrast.bEnabled    true
m_radio.bEnabled               false
m_display.contrast.nHigh       -80
AGC
m_tx.strMod
m_display.n64FreqLow           2801644
Freq
m_name.strFolder               MIL-STD 188-141 - ALE
m_radio.nBandwidth             63913
m_name.strGroup                -- UNKNOWN
m_display.nBandwidth           63913
m_display.bSmallIcon           true
m_rx.astrDemod_count           1
m_radio.n64FreqLow             2801644
Audio
Filter
m_flags.bDefault               false
m_display.scale.nLow           -151
m_display.contrast.nLow        -138
m_rx.anEnabled                 1
Squelch
CW
Mode
m_display.scale.nHigh          -42

0
投票

请尝试以下基于 LINQ to XML API 的解决方案。自 2007 年以来,它在 .Net Framework 中可用。

VB.NET

Sub Main
    Const FILENAME As String = "e:\Temp\Raimund.xml"
    Dim xdoc As XDocument = XDocument.Load(FILENAME)
    
    Dim m_rx As XAttribute = xdoc.Descendants("RX").FirstOrDefault().Attribute("m_rx.astrDemod_value_0")
    Dim rx As XElement = XElement.Parse(m_rx.Value)
    
    Console.WriteLine("Freq='{0}', Mode='{1}'", _
        rx.Descendants("Freq").SingleOrDefault().Attribute("m_freq.n64RX").Value, _
        rx.Descendants("Mode").SingleOrDefault().Attribute("m_mode.nMode").Value)
End Sub

输出

Freq='2835000', Mode='0'
© www.soinside.com 2019 - 2024. All rights reserved.